自动化批量管理工具 pssh

pssh提供OpenSSH和相关工具的并行版本。包括pssh,pscp,prsync,pnuke和pslurp。该项目包括psshlib,可以在自定义应用程序中使用。

pssh是python写的可以并发在多台机器上批量执行命令的工具,它的用法可以媲美ansible的一些简单用法,执行起来速度比ansible快它支持文件并行复制,远程命令执行,杀掉远程主机上的进程等等。

杀手锏是文件并行复制,,当进行再远程主机批量上传下载的时候,最好使用它。pssh用于批量ssh操作大批量机器;pssh是一个可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的;比起for循环的做法,更推荐使用pssh!

使用pssh的前提是:必须在本机与其他客户机上配置好密钥认证访问(即ssh无密码登录信任关系)。

下面就说下使用pssh进行批量操作的记录:

1)安装pssh

yum install -y pssh

2)pssh用法

-h      执行命令的远程主机列表文件 
-H      user@ip:port 文件内容格式[user@]host[:port]
-l      远程机器的用户名
-p      一次最大允许多少连接
-o      输出内容重定向到一个文件
-e      执行错误重定向到一个文件
-t      设置命令执行的超时时间
-A      提示输入密码并且把密码传递给ssh(注意这个参数添加后只是提示作用,随便输入或者不输入直接回车都可以)
-O      设置ssh参数的具体配置,参照ssh_config配置文件
-x      传递多个SSH 命令,多个命令用空格分开,用引号括起来
-X      同-x 但是一次只能传递一个命令
-i      显示标准输出和标准错误在每台host执行完毕后
-I      读取每个输入命令,并传递给ssh进程 允许命令脚本传送到标准输入

新版命令已变更为:

Usage: parallel-ssh [OPTIONS] command [...]

Options:
  --version             show program's version number and exit
  --help                show this help message and exit
  -h HOST_FILE, --hosts=HOST_FILE
                        hosts file (each line "[user@]host[:port]")
  -H HOST_STRING, --host=HOST_STRING
                        additional host entries ("[user@]host[:port]")
  -l USER, --user=USER  username (OPTIONAL)
  -p PAR, --par=PAR     max number of parallel threads (OPTIONAL)
  -o OUTDIR, --outdir=OUTDIR
                        output directory for stdout files (OPTIONAL)
  -e ERRDIR, --errdir=ERRDIR
                        output directory for stderr files (OPTIONAL)
  -t TIMEOUT, --timeout=TIMEOUT
                        timeout (secs) (0 = no timeout) per host (OPTIONAL)
  -O OPTION, --option=OPTION
                        SSH option (OPTIONAL)
  -v, --verbose         turn on warning and diagnostic messages (OPTIONAL)
  -A, --askpass         Ask for a password (OPTIONAL)
  -x ARGS, --extra-args=ARGS
                        Extra command-line arguments, with processing for
                        spaces, quotes, and backslashes
  -X ARG, --extra-arg=ARG
                        Extra command-line argument
  -i, --inline          inline aggregated output and error for each server
  --inline-stdout       inline standard output for each server
  -I, --send-input      read from standard input and send as input to ssh
  -P, --print           print output as we get it

Example: pssh -h hosts.txt -l irb2 -o /tmp/foo uptime

新旧命令对应:

parallel-nuke   --> pnuke
parallel-rsync  --> prsync
parallel-scp    --> pscp
parallel-slurp  --> pslurp
parallel-ssh    --> pssh

3)pssh实例说明

hosts.txt文件内容如下:
(列表文件内的信息格式是“ip:端口”,如果本机和远程机器使用的ssh端口一致,则可以省去端口,直接用ip就行。不过建议还是将端口都带上为好。)

192.168.1.101:22
192.168.1.109:22
192.168.1.118:25791
192.168.1.105:25791

如上四台机器放在一个列表文件hosts.txt内,本机已经和这四台机器做了ssh无密码登陆的信任关系

注意:列表文件内的机器必须提前和本机做好ssh信任关系,如果没有做的话,那么pssh批量执行时,轮到这台没有做信任关系的机器时就不会执行。

a)批量执行命令

pssh -h hosts.txt -l root -i 'uptime'

如果添加-A参数,那么即使提前做了ssh信任关系,还是会提示输入密码!

pssh -h hosts.txt -l root -i -A 'uptime'
pssh -h hosts.txt -l root -i -t 10 -o /root/pssh.log 'uptime && date'

b)批量上传文件或目录(pscp)

批量上传本地文件/mnt/test.file到远程服务器上的/tmp目录:

pscp -l root -h hosts.txt /mnt/test.file /tmp/

批量上传本地文件/mnt/test.file、/mnt/aa.file、/mnt/bb.file到远程服务器上的/tmp目录:

pscp -l root -h hosts.txt /mnt/test.file /mnt/aa.file /mnt/bb.file /tmp/
或者:
pscp -l root -h hosts.txt /mnt/{test.file,aa.file,bb.file} /tmp/

批量上传本地目录/mnt/zhong到远程服务器上的/tmp目录(上传目录需要添加-r参数):

pscp -l root -h hosts.txt -r /mnt/zhong /tmp/

批量上传本地目录/mnt/zhong、/mnt/aa、/mnt/vv到远程服务器上的/tmp目录

pscp -l root -h hosts.txt -r /mnt/zhong /mnt/aa /mnt/vv /tmp/
或者:
pscp -l root -h hosts.txt -r /mnt/{zhong,aa,vv} /tmp/

c)批量下载文件或目录(pslurp)

批量下载服务器上的某文件到本地,不用担心重名问题,因为pslurp已经建立了以文件列表内的ip为名称的目录来存放下载的文件:

pslurp -l root -h hosts.txt /etc/hosts .

另外特别注意:
上面的批量下载操作,只能下载到本地的当前目录下,不能在命令中跟指定的路径:
pslurp -l root -h hosts.txt /etc/hosts /mnt/

要想下载到本机的/mnt目录下,正确的做法是先切换到/mnt目录下,然后再执行下载命令:(列表文件要跟全路径)

pslurp -l root -h /root/hosts.txt /etc/hosts ./

上面是批量下载文件,要是批量下载目录,只需要添加一个-r参数即可!

pslurp -l root -h /root/hosts.txt -r /home/ ./

d)批量同步(prsync)

同步本机/mnt/test目录下的文件或目录到远程机器的/mnt/test路径下

prsync -l root -h hosts.txt -r /mnt/test/ /mnt/test/

同步本机/mnt/test目录下的文件或目录到远程机器的/mnt路径下

prsync -l root -h hosts.txt -r /mnt/test/ /mnt/

【注意:上面批量同步目录操作是将本机对应目录数据同步到远程机器上,远程机器上对于目录下多余的文件也会保留(不会删除多余文件)】

同理,批量同步文件操作,去掉-r参数。

【注意:同步文件的时候,其实就是完全覆盖,远程机器对应文件内的文件会被全部替换!】

如下:同步本机的/mnt/test/file文件内容到远程服务器/mnt/test/file文件内

prsync -l root -h hosts.txt /mnt/test/file /mnt/test/file
prsync -l root -h hosts.txt /mnt/test/file /mnt/aaa

e)批量kill远程机器上的进程(pnuke)

比如批量kill掉远程机器上的nginx进程

pnuke -h hosts.txt -l root nginx
上一篇:牛客多校第三场 F Planting Trees


下一篇:windows 修改hosts文件不生效