运维利器pssh、pdsh和mussh的使用技巧
今天周末,加上下雨天。没打算出门,翻了几页书,怕日后容易忘记,做个笔记,总结一下批量运维工具的一些使用方法以及异同之处。
其中给出pssh的5个程序的使用方法图解:
区别:
pssh有5个程序
pssh:执行命令 pscp:上传文件 pslurp:下载文件到本机
prsync:将本地文件同步到远程主机 pnuke杀死远程主机的某个进程(如httpd)
pdsh有两个方法:
pdsh:执行命令,类似pssh,但增加了命令交互模式以及正则表达式,更灵活。
pdcp:上传文件到远程主机,与pscp类似,但管理主机和远程主机都要安装pdsh包。
mussh:
mussh:批量执行远程管理命令,主要是比pssh,pdsh增加了一个可执行脚本的功能。(shell,Perl,Python脚本) 指定的参数作用跟pssh 有很大区别。
原理:基于ssh秘钥认证建立信任,在本管理主机上运行pssh、pdsh和mussh工具命令将shell命令发送至管理远程主机(单主机或主机群),相当于登陆到远程主机上执行了同样的shell命令。
由于条件限制,只有两台虚拟机,一台用于模拟管理,一台用于模拟远程主机。
管理主机IP:192.168.1.106 (master1)
远程主机IP:192.168.1.108 (master2)
一、在本地主机上创建RSA密钥和公钥。
以本地普通用户soul用户登陆为例。
本管理主机以及所有远程主机的普通账户密码均设置为soul,123456(测试环境)
1、在管理主机上建立密钥过程:
[soul@master1 root]$ mkdir ~/.ssh
[soul@master1 root]$ chmod 700 ~/.ssh
[soul@master1 root]$ cd ~/.ssh
[soul@master1 .ssh]$ ssh-keygen -t rsa //全部默认,一路回车。
#将本生成的公钥文件整合为 authorized_keys,进行授权后复制到远程主机的同目录下.ssh/,需要在远程主机soul用户根目录下建立目录#mkdir ~/.ssh #chmod 700 ~/.ssh
[soul@master1 .ssh]$ cat /home/soul/.ssh/id_rsa.pub > authorized_keys
[soul@master1 .ssh]$ chmod 600 ~/.ssh/authorized_keys
[soul@master1 .ssh]$ scp authorized_keys [email protected]:/home/soul/.ssh/
2、测试ssh秘钥认证。
[soul@master1 .ssh]$ ssh 192.168.1.108 uptime
14:40:17 up 4:47, 3 users, load average: 1.60, 1.73, 1.78
测试成功,已经建立信任。
有朋友可能会有疑问:直接用ssh就可以进行远程管理了啊,为毛还要pssh、pdsh和mussh工具?因为ssh只能单台执行命令,不能批量同时管理远程主机。pssh、pdsh和mussh是一款为了可以批量管理远程主机而开发的工具。
A: pssh的安装与用法:
有5个主程序:
pssh:在远程多台主机上并行运行命令。就是执行shell命令
pscp:将本地主机上的文件并行复制到远程多台主机上。就是上传文件到远程主机上
pslurp:将远程多台主机上的文件复制到本地主机上。就是下载文件到本地管理主机。与pscp相反
prsync:使用rsync协议将管理主机本地文件同步到远程多台主机上。
pnuke:在多台远程主机上并行killall某一服务进程。
参数介绍:
具体常用介绍:
-h HOST_FILE 后边跟远程主机列表(ip)
-H HOST_STRING 后边跟远程主机名或者ip地址
-l USER 指定远程主机的用户名
-p PAR 指定pssh最大的并行线程数。
-o 将输出的内容重定向到一个指定的文件中
-O 指定ssh参数的具体配置
-e 将执行错误重定向到一个指定的文件中
-t 设定命令执行超时时间
-x 传递ssh命令的一些参数
-i 在远程主机上执行命令完成后显示标准输出和标准错误
-P 在执行远程命令时,输出执行结果
下载安装pssh-2.3.1
#wget http://files.opstool.com/files/pssh-2.3.1.tar.gz
# tar zxvf pssh-2.3.1.tar.gz
# cd pssh-2.3.1
# python setup.py build
# python setup.py install
1、批量查看远程主机信息
单台主机
[soul@localhost root]$pssh -H [email protected] -P date
192.168.1.108: 2017年 06月 08日 星期四 16:39:03 CST
[1] 15:26:01 [SUCCESS] [email protected]
[soul@localhost root]$ pssh -H [email protected]:2202 -P uptime //当远程主机端口不为默认22
192.168.1.108: 16:39:12 up 6:46, 2 users, load average: 1.49, 1.94, 1.96
[1] 15:26:10 [SUCCESS] [email protected]
-H 为指定某一台主机/IP -P为打印出返回的结果内容 date为要执行的shell命令
2、批量文件列表:
建立文件/etc/pssh/hosts 并授权权限chmod给soul用户
#cat /etc/pssh/hosts
192.168.1.108
14.152.49.51:2202
[soul@localhost pssh]$ pssh -i -O "StrictHostKeyChecking=no" -h /etc/pssh/hosts "uptime"
[1] 15:41:23 [SUCCESS] 14.152.49.51:2202
15:48:22 up 43 days, 6:40, 2 users, load average: 0.00, 0.02, 0.00
[2] 15:41:23 [SUCCESS] 192.168.1.108
16:54:25 up 7:01, 2 users, load average: 1.55, 2.10, 2.06
-i为标准输出,跟-P直接打印有区别。-O 大写 为指定ssh参数的具体配置“StrictHostKeyChecking=no”参数可以让远程主机自动接受本地主机的key,不用每次都手动输入yes确认。 -h指定文件主机列表
3、远程执行解压文件安装包
#pssh -i -H [email protected] "tar -zxvf /usr/local/src/pssh-2.3.1.tar.gz"
文件必须放在soul根目录并有执行权限,假如在root目录下需要sudo
#pssh -i -H [email protected] "sudo "tar -zxvf /usr/local/src/pssh-2.3.1.tar.gz" "
报错:Stderr: sudo: sorry, you must have a tty to run sudo
解决:vi /etc/sudoers 注释掉 Default requiretty 一行 #Default requiretty
好像还是解决不了
4、pscp 将本地文件传到远程主机
[soul@localhost root]$pscp -H [email protected] /etc/ssh/ssh_config /tmp
[soul@localhost root]$pscp -H [email protected] -r /etc/ssh/ /tmp
-r 指拷贝文件目录
5、pslurp 将远程主机文件下载到本机
[soul@localhost root]$pslurp -H [email protected] -L /tmp/ /tmp/ssh_config ssh_config
[1] 16:26:47 [SUCCESS] [email protected]
-L 指定存放到本地哪个路径下 下载远程主机的/tmp/ssh_config文件到本地名为ssh_config
但下载后的结果会自动以IP或者主机名创建一个目录 以便分清是从哪台主机上下载下来的。如果是下载文件目录 需要在-L 前面加-r参数
6、prsync:使用rsync协议将管理主机本地文件同步到远程多台主机上。
[soul@localhost root]$ /usr/local/python27/bin/prsync -h /etc/pssh/hosts -l soul -a -r /etc/httpd /tmp/
[1] 16:32:55 [SUCCESS] 192.168.1.108
远程主机上查看
[root@master2 tmp]# ll
总计 8
drwxr-xr-x 3 soul soul 4096 01-02 11:37 httpd
-l 指定远程用户 -a 指定文件的属性不变,-r 文件目录迭代
7、在多台远程主机上并行killall某一服务进程。
/usr/local/python27/bin/pnuke -H [email protected] mysqld
[1] 16:45:45 [SUCCESS] [email protected]
测试了几次都没有杀死mysqld进程为什么?
B: pdsh的安装与用法:
http://code.google.com/p/pdsh/
[root@server ~]# tar jxvf pdsh-2.29.tar.bz2
[root@server ~]# cd pdsh-2.29
[root@server pdsh-2.29]#./configure --with-ssh --with-rsh --with-mrsh --with-mqshell --with-qshell --with-dshgroups --with-machines=/etc/pdsh/machines
[root@server pdsh-2.29]# make
[root@server pdsh-2.29]# make install
在执行configure阶段,“--with-ssh”参数表示启用ssh模块,其他参数都有类似的含义,而“--with-dshgroups”表示启用主机组支持,启用此参数后,就可以将一组主机列表写入一个文件并放到~/.dsh/group或/etc/dsh/group目录下,然后通过pdsh的“-g”参数进行调用。最后的参数“--with-machines”是“--with-dshgroups”参数的扩展,通过将所有要管理的主机列表都写入指定的/etc/pdsh/machines文件中,接着通过pdsh的“-a”参数调用,最终完成所有主机的便捷管理。
1、pdsh:批量执行命令。类似pssh 但多了交互命令模式以及正则表达式功能
2、pdcp:批量将本地文件/目录复制上传到远程主机上。类似pscp 但pdcp需要在管理主机跟远程主机同时安装pdcp。所以文件上传推荐使用pscp就行了
pdsh语法介绍:
-w host,host
指定远程主机,可以指定多个,每个主机用逗号隔开,host可以是主机名也可以是IP地址。
#pdsh -w ssh:user001,ssh:user002,ssh:user003 "date"
此命令用来查看user001、user002、user003主机上的时间,其中ssh表示在远程主机上执行命令的形式,默认是rsh。
正则表达式
#pdsh -w ssh:user00[1-10] "date"
此命令用于在user001到user0010上执行date命令。
pdsh -w ssh:user0[10-31],/1$/ "uptime"
此命令在选择远程主机时使用了正则表达式,表示在user010到user031中选择以1结尾的主机名,即在user011、user021、user031上执行uptime命令
-R
指定使用rcmd的模块名,默认是rsh。如果要选择ssh,可以通过如下方式指定:
pdsh -R ssh -w user00[1-10] "date"
-l
指定在远程主机上使用的用户名称。例如:
pdsh -R ssh -l opsuser -w user00[1-9] "date"
-x
此参数用来排除某些或某个主机,例如:
pdsh -R ssh -l opsuser -w user00[1-9] -x user005,user007 "date"
-t 指定连接远程主机的超时时间,以秒为单位,默认是10秒,可以通过此参数修改默认值,例如:pdsh -R ssh -w slave000[1-9] -t 15 "date"
-u设置远程命令执行的超时时间,以秒为单位,以ssh方式连接时,默认时间为无限
-f 设置同时连接到远程主机的个数
-N 此参数用来关闭远程主机所返回结果中的主机名显示
-a 通过此参数可以指定所有的远程主机,设置此参数后,pdsh默认会查看/etc/machines文件中的主机列表,要改变此路径,在编译pdsh时通过“--with-machines”参数指定即可
-g 此参数用来指定一组远程主机,在编译pdsh时可以通过“--with-dshgroups”参数来激活此选项,默认可以将一组主机列表写入一个文件中并放到本地主机的~/.dsh/group或/etc/dsh/group目录下,这样就可以通过“-g”参数调用了。例如:pdsh -R ssh -g userhosts "date",其中“userhosts”是一个主机列表文件,可以将此文件放在~/.dsh/group或/etc/dsh/group目录下
-X 此参数用来排除指定组内的所有主机,经常与“-a”参数一起使用。例如:
pdsh -R ssh -a -X userhosts "date"
C:做主机ssh封装器mussh
mussh 主要是增加了脚本执行的功能。
mussh的突出功能是可以在多台远程主机上执行本地的脚本,包括shell,Perl,Python脚本。
下载https://mussh.sourceforge.net/
解压即可使用
tar -zxvf mussh-1.0.tgz
#cd mussh-1.0
参数:
d [n] Shell调试模式,n取值:0-2
-v [n] SSH调试模式,n取值:0-3
-m [n] 并发进程数,如果设置为0,则表示没限制
-q 安静模式
-i [identity ..] 加载密钥文件
-o 设置ssh参数
-b 将每个主机的输出打印到一个块中,不和其它主机输出混合
-B 允许所有主机输出混合在一起,默认值
-u 去除重复的主机名,默认值
-U 不管指定的主机名是否重复
-P 如果密钥认证失败,不不提示输入密码登录
-l 在远程主机上执行命令的用户
-s 指定在远程主机上执行脚本的shell路径,例如:mussh -s /usr/bin/python -C mysql_check.py
-t 在远程主机上执行命令的超时时间
-h 指定某一台主机,或同时多台,用逗号分隔。
-H 指定某一个文件列表。
-c 指定执行某一个或多个shell命令,用逗号隔开。
-C 指定执行某一个脚本文件。
[soul@localhost mussh]$mussh -H /etc/mussh/hosts -l soul -c uptime
[soul@localhost mussh]$mussh -o "port=2202" -H /etc/mussh/hosts -s "/usr/bin/python /home/mysqlback.py"
pssh、pdsh和mussh三个工具的使用区别介绍到这里。