pssh 批量运维工具

一、简介

pssh全称是parallel-ssh,是一个Python编写的可以并发在多台服务器上批量执行命令的工具,

它支持文件并行复制、远程并行执行命令、杀掉远程主机上的进程等。

前提:使用pssh工具包,必须保证本地主机和管理的远程主机之间的单向信任,

也就是要在本地主机和所有远程服务器上配置密钥认证访问。

项目地址:https://code.google.com/p/parallel-ssh/

pssh 包安装5个实用程序:parallel-ssh、parallel-scp、parallel-rsync、parallel-slurp、parallel-nuke 每个实用程序都并行地操作多个主机。

  • parallel-ssh 在多个主机上并行地运行命令。

  • parallel-scp 把文件并行地复制到多个主机上。(全量拷贝)

  • parallel-rsync 通过 rsync 协议把文件高效地并行复制到多个主机上。(增量拷贝)

  • parallel-slurp 把文件并行地从多个远程主机复制到中心主机上。

  • parallel-nuke 并行地在多个远程主机上杀死进程。

二、安装

yum -y install pssh

设置别名:

alias pscp=pscp.pssh

三、pssh

1、参数

pssh --help可以查看命令参数选项:

[cuadmin@cdh68 ~]$ pssh --help
Usage: pssh [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

中文翻译:

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

2、使用

在使用工具前,确保主机间做了密钥认证,否则无法实现自动化,当然我们可以使用sshpass(yum install sshpass)配合pssh -A参数实现自动输入密码,但这要保证多台主机的密码相同,同时还要注意如果known_hosts没有信任远程主机,那么命令执行会失败,可以加上-O StrictHostKeyChecking=no参数解决,ssh能用的选项pssh也能用

# 集群刚装好系统处于原始状态,可以使用下面命令来生成其他机器的ssh秘钥并将各机器的rsa公钥添加到本机
sshpass -p password pssh -I -A -O StrictHostKeyChecking=no -h ip.txt -l cuadmin -i "ssh-ketgen"  # 然后本机回车n次帮助各机器生成ssh秘钥,password为其它机器的统一密码
sshpass -p password pssh -A -O StrictHostKeyChecking=no -h ip.txt -l cuadmin -i "ssh-copy-id localhost-ip" # localhost-ip改成你本机的ip

ip.txt

10.172.54.68
10.172.54.69
10.172.54.70

批量执行命令:

[cuadmin@cdh68 ~]$ pssh -h ip.txt uptime
[1] 17:09:09 [SUCCESS] 10.172.54.68
[2] 17:09:09 [SUCCESS] 10.172.54.69
[3] 17:09:09 [SUCCESS] 10.172.54.70
[cuadmin@cdh68 ~]$ pssh -h ip.txt -P uptime
10.172.54.68:  17:10:02 up 549 days, 23:50,  4 users,  load average: 0.17, 0.12, 0.19
[1] 17:10:02 [SUCCESS] 10.172.54.68
10.172.54.70:  17:10:02 up 549 days, 23:43,  2 users,  load average: 0.11, 0.17, 0.22
[2] 17:10:02 [SUCCESS] 10.172.54.70
10.172.54.69:  17:10:02 up 549 days, 23:47,  2 users,  load average: 0.00, 0.04, 0.05
[3] 17:10:02 [SUCCESS] 10.172.54.69

保存每台服务器运行的结果:

20201013  ambariashell  cling-master  CTR_Mobile  dfs  download  hosts.txt  ip.txt  password.sh  password.txt  software  tencent2019Rank1st  test.sh  yarn
[cuadmin@cdh68 ~]$ mkdir /tmp/pssh
[cuadmin@cdh68 ~]$ pssh -h ip.txt -P -o /tmp/pssh/ uptime
10.172.54.68:  17:14:41 up 549 days, 23:54,  4 users,  load average: 0.07, 0.09, 0.16
[1] 17:14:41 [SUCCESS] 10.172.54.68
10.172.54.69:  17:14:41 up 549 days, 23:52,  2 users,  load average: 0.28, 0.12, 0.08
[2] 17:14:41 [SUCCESS] 10.172.54.69
10.172.54.70:  17:14:41 up 549 days, 23:48,  2 users,  load average: 0.10, 0.13, 0.20
[3] 17:14:41 [SUCCESS] 10.172.54.70
[cuadmin@cdh68 ~]$ ll /tmp/pssh/
total 12
-rw-r----- 1 cuadmin cuadmin 72 Nov  5 17:14 10.172.54.68
-rw-r----- 1 cuadmin cuadmin 72 Nov  5 17:14 10.172.54.69
-rw-r----- 1 cuadmin cuadmin 72 Nov  5 17:14 10.172.54.70
[cuadmin@cdh68 ~]$ cat /tmp/pssh/*
 17:14:41 up 549 days, 23:54,  4 users,  load average: 0.07, 0.09, 0.16
 17:14:41 up 549 days, 23:52,  2 users,  load average: 0.28, 0.12, 0.08
 17:14:41 up 549 days, 23:48,  2 users,  load average: 0.10, 0.13, 0.20

四、pscp

pscp用来将文件并行的复制到多个主机上。

pscppssh的很多参数都是一样的,就不在多说了,举一个简单的例子来说明一下pscp的简单实用。

基本使用方法:

pscp -h ip文件 本地文件 远程目录

例子:将本机的/tmp/i.txt文件复制到ip.txt列出的主机上的/tmp目录

[cuadmin@cdh68 ~]$ cat /tmp/i.txt 
hello pssh!
[cuadmin@cdh68 ~]$ pscp -h ip.txt /tmp/i.txt /tmp/
[1] 17:24:00 [SUCCESS] 10.172.54.70
[2] 17:24:00 [SUCCESS] 10.172.54.68
[3] 17:24:00 [SUCCESS] 10.172.54.69
#传目录
[cuadmin@cdh68 ~]$ pscp -r -h ip.txt test/ /tmp/dir1/

特别参数说明:

  • -r:用于递归的复制目录

传文件,不支持远程新建目录

五、pslurp

pslurp把文件并行地从多个远程主机复制到中心主机上,从远程拉取文件到本地,在本地自动创建目录名为远程主机ip的目录,将拉取的文件放在对应主机IP目录下

基本用法:

pslurp -h ip.txt -L <本地目录>  <远程目录/文件>  <本地重命名>

例子:将ip.txt列出的主机上的/tmp/i.txt文件复制到本机的/data1/tmp/ip/i.txt

[cuadmin@cdh68 ~]$ pslurp -h ip.txt -l cuadmin -L /data1/tmp /tmp/i.txt i.txt
[1] 17:34:33 [SUCCESS] 10.172.54.70
[2] 17:34:33 [SUCCESS] 10.172.54.68
[3] 17:34:33 [SUCCESS] 10.172.54.69
[cuadmin@cdh68 ~]$ ll /data1/tmp/
total 12
drwxr-x--- 2 cuadmin cuadmin 4096 Nov  5 17:34 10.172.54.68
drwxr-x--- 2 cuadmin cuadmin 4096 Nov  5 17:34 10.172.54.69
drwxr-x--- 2 cuadmin cuadmin 4096 Nov  5 17:34 10.172.54.70
[cuadmin@cdh68 ~]$ ll /data1/tmp/10.172.54.68
total 4
-rw-r----- 1 cuadmin cuadmin 12 Nov  5 17:34 i.txt
[cuadmin@cdh68 ~]$ cat /data1/tmp/10.172.54.68/i.txt 
hello pssh!

#拉取目录
[cuadmin@cdh68 ~]$ pslurp -r -h ip.txt -L /root/ /root/test temp

特别参数说明:

-L 指定本地存放文件的目录

虽然帮助文档中说 -L 参数是可选的,但是经过我试验 -L 参数是必须的,要不然会报错。

增加 -L 参数后,会在 -L 指定的本地目录下创建[用户@]主机IP[:端口]目录,对应的目录下用于存放从改主机复制过来的文件。

六、pnuke

pnuke并行地在多个远程主机上杀死进程。

pnuke 的参数与pssh一样,只是最后的字符串为要结束的进程名称

例子:将ip.txt列出的主机上的httpd进程杀死

[cuadmin@cdh68 ~]$ pnuke -h ip.txt -l cuadmin httpd
[1] 09:55:28 [SUCCESS] 10.172.54.68
[2] 09:55:28 [SUCCESS] 10.172.54.69
[3] 09:55:28 [SUCCESS] 10.172.54.70

7、prsync

并行传输文件到远端

 #传文件,支持远程新建目录,即目录不存在则新建 
prsync -h ip.txt test.py /tmp/dir2/ 

#传目录 
prsync -r -h ip.txt test/ /tmp/dir3/


本文分享自微信公众号 - 大数据AI(songxt1990)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章