如果我有一台服务器,希望用它来处理特定事物(比如运行EDA工具),那么我可能需要:
* 查看和了解系统的基本信息
* 安装依赖的系统库
* 安装依赖的系统工具
* 启动或关闭系统服务
* ...
如果我有一批服务器,做同样的事情,我可能需要pssh或者ansible,但是他们存在或多或少地存在一些问题:
* 需要明文输入密码
* 打印的信息不够个性化(不够简洁或者不够详细)
* 执行任务脚本不够简单
* ...
如果你会一点点python,那么在batch_run的基础上,如上问题都可以轻松解决。
那么batch_run是什么?
类似于pssh或者ansible,batch_run用于在多机器环境中批量推送和运行指定命令,同时在快捷操作/简洁显示/密码安全方面有独到之处。
batch_run的底层也是基于ssh实现的。
batch_run的地址位于 https://gitee.com/liyanqing1987/batch_run。
下面来演示如何安装/配置/使用它。
1. 获取安装包
登陆到batch_run的gitee地址,如下,点击“克隆/下载”来下载ZIP安装包。
将zip安装包拷贝到linux环境,安装目录下。
[root@cmp001 tools]# ls anaconda3 batch_run-master.zip
解压缩。
[root@cmp001 tools]# unzip batch_run-master.zip Archive: batch_run-master.zip c8a963fed55640a372b763935175749c36b8c093 creating: batch_run-master/ inflating: batch_run-master/.gitignore inflating: batch_run-master/LICENSE inflating: batch_run-master/README creating: batch_run-master/common/ inflating: batch_run-master/common/common_password.so creating: batch_run-master/config/ inflating: batch_run-master/config/host.list extracting: batch_run-master/config/password.encrypted inflating: batch_run-master/install.py creating: batch_run-master/scripts/ inflating: batch_run-master/scripts/install_system_library.sh inflating: batch_run-master/scripts/install_system_tools.sh extracting: batch_run-master/scripts/print_os.sh creating: batch_run-master/tools/ inflating: batch_run-master/tools/encrypt_python.py inflating: batch_run-master/tools/get_password.py inflating: batch_run-master/tools/save_password.py
将解压后的目录 batch_run-master 重命名为 batch_run。
[root@cmp001 tools]# mv batch_run-master batch_run
进入batch_run目录,可见其文件结构如下。
[root@cmp001 tools]# cd batch_run/ [root@cmp001 batch_run]# ls bin common config install.py LICENSE README scripts tools
2. 安装
batch_run的安装依赖python3.8,推荐采用对应版本的anaconda,比如Anaconda3-2021.05-Linux-x86_64.sh.。
同时需要在python中安装加密模块Crypto,采用命令“pip install pycryptodome”可以便捷安装。
之后,进入batch_run的安装包目录下,采用命令 python3 install.py安装。
[root@cmp001 batch_run]# /ic/tools/anaconda3/bin/python3 install.py >>> Check python version. Required python version : (3, 8) Current python version : (3, 8) >>> Generate script "/ic/tools/batch_run/bin/batch_run". >>> Generate script "/ic/tools/batch_run/tools/save_password". >>> Generate script "/ic/tools/batch_run/tools/get_password". >>> Generate script "/ic/tools/batch_run/tools/encrypt_python". >>> Generate config file "/ic/tools/batch_run/config/config.py". Done, Please enjoy it.
如果没有报错,那么就正常安装上了。
3. 配置
需要配置的主要文件位于安装目录的config目录下。
[root@cmp001 config]# ls config.py host.list password.encrypted
其中config.py是常规配置,可以不配置。
host.list用于配置所有的默认机器ip列表,最好配置。
password.encrypted用于保存加密的用户名密码信息,最好配置。
3.1 配置config.py
默认的config.py如下。
# Specify host list, default is "host.list" on current configure directory. HOST_LIST = "/ic/tools/batch_run/config/host.list" # Valid ip format, for example, "10.212.20[67].\d+". VALID_IP_FORMAT = "" # Pre-ip, for example, "10.212.206". PRE_IP = "" # Default ssh command, for example, "ssh -X -o StrictHostKeyChecking=no". DEFAULT_SSH_COMMAND = "" HOST_LIST是默认配置好的,不需要修改。 VALID_IP_FORMAT用于ip合规性检查,如果你的host.list中的ip地址没有规律,此处可以不设置。 PRE_ID用于ip简写的支持(只写最后一个.后面的数字)。 DEFAULT_SSH_COMMAND用于配置默认的ssh命令(batch_run底层基于ssh)。
我们的配置如下。
# Specify host list, default is "host.list" on current configure directory. HOST_LIST = "/ic/tools/batch_run/config/host.list" # Valid ip format, for example, "10.212.20[67].\d+". VALID_IP_FORMAT = "" # Pre-ip, for example, "10.212.206". PRE_IP = "192.168.246" # Default ssh command, for example, "ssh -X -o StrictHostKeyChecking=no". DEFAULT_SSH_COMMAND = "ssh -o StrictHostKeyChecking=no" 3.2 host.list的配置 默认的host.list如下,仅仅定义了格式。 ## Format ## # # Description # # GROUP(group_name) # ip <port> # ip <port> # ip <port> 我们把当前的3台机器配置其中。 # Master host # GROUP(master) 192.168.246.141 # Cluster hosts # GROUP(cluster) 192.168.246.140 192.168.246.128 其中192.168.246.141是当前机器,分到master组。 192.168.246.140和192.168.246.128是cluster相关的机器,分到cluster组。
如果机器的ssh端口从22修改为其他值,可以在host ip追加ssh port信息,比如 192.168.246.140 8080,这样batch_run可以从配置文件中直接获取机器默认的ssh port。
3.3 password.encrypted的配置
batch_run支持交互式输入ssh登陆密码,但是这样不太安全,你可以通过batch_run自带的工具将用户密码信息加密并保存于此,batch_run可以自动引用,既便捷,又能保证安全。
[root@cmp001 config]# ../tools/save_password -u root -p 870222 [root@cmp001 config]# cat password.encrypted root 30a777e97f52da1f7a1731b216f8ee6d
4. batch_run用法
batch_run支持多个参数。
[root@cmp001 batch_run]# bin/batch_run -h usage: batch_run.py [-h] [-H HOSTS [HOSTS ...]] [-G HOST_GROUPS [HOST_GROUPS ...]] [-P PORT] [-u USER] [-p PASSWORD] [-c COMMAND [COMMAND ...]] [-m MULTI_COMMANDS] [-t TIMEOUT] [-C] [-d] optional arguments: -h, --help show this help message and exit -H HOSTS [HOSTS ...], --hosts HOSTS [HOSTS ...] Specify host(s) which run command on, default is all. -G HOST_GROUPS [HOST_GROUPS ...], --host_groups HOST_GROUPS [HOST_GROUPS ...] Specify host group which run command on, default is all. -P PORT, --port PORT Specify host port which ssh connect with, default is none. -u USER, --user USER Specify the user when connectting host as. -p PASSWORD, --password PASSWORD Specify the user password when connectting host with. -c COMMAND [COMMAND ...], --command COMMAND [COMMAND ...] Specify command you want run on specified host(s). -m MULTI_COMMANDS, --multi_commands MULTI_COMMANDS Specify command file, will execute line by line. -t TIMEOUT, --timeout TIMEOUT Specify ssh command timeout, default is 100 seconds. -C, --compact Enable compact mode, try to print output message on one line. -d, --debug Enable debug mode,print more debug messages.
-H,用于指定一个或多个host ip,可以是ip全称,如果config.py中配置了PRE_IP变量,此处也可以仅输入最后一个.后面的数字。
-G,用于指定一个或多个host group,既host.list中的GROUP。通过group来区分和管理多台不同用途的host会非常方便。
-P,如果机器的ssh port不是22,可以通过参数-P指定ssh port。
-u,batch_run指定ssh的时候,默认使用当前用户登陆,你也可以设置制定的登陆用户,它会采用ssh USER@ip的方式登陆。
-p,如果没有配置ssh免密登陆,需要用参数-p明文输入用户密码,但是这样是不安全的,建议将常用的用户密码配置到password.encrypted文件中。
-c,登陆到指定机器上执行的命令。
-m,如果登陆到指定机器上后需要执行多条命令,可以将多条命令写入到一个文件中去,然后采用-m FILE的方式来执行,需要注意的是,文件中的“-”符号最好写成“\-”的方式转义一下。
-t,默认batch_run在每台机器上允许最长100秒的任务执行时间,如果任务执行时间过长,需要在此处指定最长时间。
-C,简洁输出模式,如果命令输出只有一行,可以采用这个参数。
-d,debug模式,输出详细信息,包括执行命令和执行输出结果。
其中-m参数,常用的一些多行命令文件,比如安装系统库的文件,比如安装系统工具的文件,可以写到安装目录下的scripts目录下,那么-m FILE的用法中,FILE不需要写明绝对路径,仅注明文件名就可以直接引用。
5. 示例
5.1 查看所有机器的操作系统版本,简洁显示
[root@cmp001 batch_run]# bin/batch_run -C -c "cat /etc/redhat-release" >>> 192.168.246.141 CentOS Linux release 7.9.2009 (Core) >>> 192.168.246.140 CentOS Linux release 7.9.2009 (Core) >>> 192.168.246.128 CentOS Linux release 7.9.2009 (Core)
5.2 指定机器组安装系统工具,debug模式
[root@cmp001 batch_run]# bin/batch_run -c "yum install \-y ksh" -G cluster -d >>> 192.168.246.140 ssh -o StrictHostKeyChecking=no root@192.168.246.140 yum install \-y ksh ==== output ==== Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.tuna.tsinghua.edu.cn * extras: mirrors.huaweicloud.com * updates: mirrors.tuna.tsinghua.edu.cn Package ksh-20120801-142.el7.x86_64 already installed and latest version Nothing to do ================ >>> 192.168.246.128 ssh -o StrictHostKeyChecking=no root@192.168.246.128 yum install \-y ksh ==== output ==== Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.tuna.tsinghua.edu.cn * epel: mirrors.tuna.tsinghua.edu.cn * extras: mirrors.huaweicloud.com * updates: mirrors.huaweicloud.com Resolving Dependencies --> Running transaction check ---> Package ksh.x86_64 0:20120801-142.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: ksh x86_64 20120801-142.el7 base 884 k Transaction Summary ================================================================================ Install 1 Package Total download size: 884 k Installed size: 3.1 M Downloading packages: Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : ksh-20120801-142.el7.x86_64 1/1 Verifying : ksh-20120801-142.el7.x86_64 1/1 Installed: ksh.x86_64 0:20120801-142.el7 Complete! ================
5.3 指定机器安装多个系统库,机器ip简写
[root@cmp001 batch_run]# bin/batch_run -m install_system_library.sh -H 140 >>> 192.168.246.140 Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile ... Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: gitk noarch 1.8.3.1-23.el7_8 base 152 k Transaction Summary ================================================================================ Install 1 Package Total download size: 152 k Installed size: 587 k Downloading packages: Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : gitk-1.8.3.1-23.el7_8.noarch 1/1 Verifying : gitk-1.8.3.1-23.el7_8.noarch 1/1 Installed: gitk.noarch 0:1.8.3.1-23.el7_8 Complete!
6. 特色功能说明
6.1 密码安全
不同于pssh的明文密码,batch_run的用户密码可以通过工具save_password加密后密文保存,batch_run执行ssh的时候可以自行引用,既免去了用户输入密码的繁琐,也保证了用户密码安全。
6.2 简洁显示
batch_run同时支持 简洁模式/正常模式/debug模式,可以确保按照自己需要的力度输出命令输出信息。
其中的简洁模式(-C参数)非常适合一些简短信息的收集。
6.3 便捷操作
支持单命令行模式(-c参数),也支持多命令行模式(-m参数),而且针对多命令行模式,还可以把一些常用操作(比如install_system_tools.sh)直接以文件的形式保存到安装目录下的scripts中,需要的时候直接文件名调用,非常方便。
6.4 可定制化
虽然pssh和ansible本身功能强大,但是他们总有一些不能满足用户个性化需求的地方,而用户很难找到合适的接口和途径对他们做定制化开发。
而batch_run采用python明文开发(除了common_password.so密码模块本身做了加密),用户可以按照自己的需求,在batch_run的基础上做二次开发,打造一款适用于自己公司的定制化多机器批量推送和任务运行工具!
网友留言: