如果我有一台服务器,希望用它来处理特定事物(比如运行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的基础上做二次开发,打造一款适用于自己公司的定制化多机器批量推送和任务运行工具!
|