记录日常工作关于系统运维,虚拟化云计算,数据库,网络安全等各方面问题。

轻量级运维利器pssh、pdsh和mussh的使用以及区别

 

区别:

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 soul@192.168.1.108:/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 soul@192.168.1.108 -P date

192.168.1.108: 2017年 06月 08日 星期四 16:39:03 CST

[1] 15:26:01 [SUCCESS] soul@192.168.1.108

[soul@localhost root]$ pssh -H soul@192.168.1.108: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] soul@192.168.1.108

 

-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 soul@192.168.1.108 "tar -zxvf /usr/local/src/pssh-2.3.1.tar.gz"

文件必须放在soul根目录并有执行权限,假如在root目录下需要sudo

#pssh -i -H soul@192.168.1.108 "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 soul@192.168.1.108 /etc/ssh/ssh_config /tmp

[soul@localhost root]$pscp  -H soul@192.168.1.108  -r /etc/ssh/ /tmp

-r 指拷贝文件目录

 

5、pslurp 将远程主机文件下载到本机

 

[soul@localhost root]$pslurp -H soul@192.168.1.108 -L /tmp/ /tmp/ssh_config ssh_config

[1] 16:26:47 [SUCCESS] soul@192.168.1.108

-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 soul@192.168.1.108 mysqld

[1] 16:45:45 [SUCCESS] soul@192.168.1.108

测试了几次都没有杀死mysqld进程j_0064.gif为什么?

 

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三个工具的使用区别介绍到这里。



pssh

pssh简介

pssh是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的。类似pdsh,但是相对pdsh更为简便,使用前必须在各个服务器上配置好密钥认证访问。参考pssh命令pssh HOWTO

安装

1、ubuntu安装pssh,sudo apt-get install pssh

2、ubuntu安装完pssh后,输入pssh,也许会提示:No command 'pssh' found, did you mean:...

解决办法参考Why pssh command is not working?,一条命令解决:
echo "alias pssh=parallel-ssh" >> ~/.bashrc && . ~/.bashrc,其中&& . ~/.bashrc代表立即生效。

3、设置相关命令
安装完pssh后,实际上还安装了pscp、prsync、pnuke和pslurp。和pssh命令无效的问题相同,它们默认也只能使用全名,不能只用简称。需要执行如下命令:

 

echo "alias pscp=parallel-scp" >> ~/.bashrc && . ~/.bashrc
echo "alias prsync=parallel-rsync" >> ~/.bashrc && . ~/.bashrc
echo "alias pnuke=parallel-nuke" >> ~/.bashrc && . ~/.bashrc
echo "alias pslurp=parallel-slurp" >> ~/.bashrc && . ~/.bashrc

其中,pscp把文件并行地复制到多个客户机;prsync使用rsync协议从管理机同步到客户机;pslurp将文件从客户机复制到管理机;pnuke并行地在客户机杀进程。

命令格式

命令格式:pssh [OPTIONS] command [...]

选项:

 

--version:查看版本
--help:查看帮助,即此信息
-h:主机文件列表,内容格式"[user@]host[:port]"-H:主机字符串,内容格式"[user@]host[:port]"-l:登录使用的用户名
-p:并发的线程数【可选】
-o:输出的文件目录【可选】
-e:错误输入文件【可选】
-t:TIMEOUT 超时时间设置,0无限制【可选】
-O:SSH的选项
-v:详细模式
-A:手动输入密码模式
-x:额外的命令行参数使用空白符号,引号,反斜线处理
-X:额外的命令行参数,单个参数模式,同-x
-i:每个服务器内部处理信息输出
-P:打印出服务器返回信息

实践篇

添加密钥认证访问

参考Linux之SSH密钥认证ssh使用密钥进行认证,在管理机上制作密钥对,将公钥添加给客户机,然后通过ssh免密登录。

1、确认管理机和客户机都安装了ssh。
ps aux | grep ssh

2、在管理机上创建密钥对
ssh-keygen
所有的提示按enter键即可,完成后在home目录执行ll .ssh,即可看到创建好的id_rsa和id_rsa.pub文件。

3、把公钥拷贝到所有客户机中
ssh-copy-id -i .ssh/id_rsa.pub -p 22 test@192.168.56.102

4、测试登录
上一步拷贝完成后,会提示使用ssh -p '22' 'test@192.168.56.102'测试登录。

在管理机中,使用ssh test@192.168.56.102测试登录,我们发现已经不需要输入密码了。

5、查看公钥
登录102客户机,ll .ssh,我们发现有一个authorized_keys文件,文件的内容和管理机的id_rsa.pub相同。

5、测试命令
ssh test@192.168.56.102 '/sbin/ifconfig'

返回了102客户机的ifconfig执行结果,测试成功。

6、设置sudo命令免密码
ssh test@192.168.56.102 'sudo iptables --list'
报错:sudo: no tty present and no askpass program specified

这个问题,需要在每个客户机下进行sudo免密设置。
进入客户机之后,sudo vim /etc/sudoers,添加:

 

test ALL = NOPASSWD: ALL

再次执行ssh test@192.168.56.102 'sudo iptables --list',成功。

获取每台机器的uptime

1、在管理机上新建hosts.txt,内容为:

 

test@192.168.56.102
test@192.168.56.103
test@192.168.56.104

2、执行uptime
pssh -h hosts.txt -i uptime

3、保存执行结果
pssh -h hosts.txt -i -o /tmp/pssh/ uptime

ll /tmp/pssh

cat /tmp/pssh

批量修改hostname

参考Linux批量修改多台服务器的主机名(hostname),我们把客户机的主机名改为vk102、vk103和vk104。

1、新建hosts文件,内容为:

 

192.168.56.102    vk102
192.168.56.103    vk103
192.168.56.104    vk104

2、新建hostname.sh文件,内容为:

 

#!/bin/bash
ip=`ifconfig eth0 | grep 'inet' | awk '{print $2}' | tr -d 'addr:'`
hostname=`cat /home/test/hosts | grep $ip | awk '{print $2}'`
echo $ip
echo $hostname
hostnamectl set-hostname --static $hostname
hostname $hostname

3、发送到hosts和hostname.sh到客户机/home/test目录下
pscp -h hosts.txt ./hosts /home/test
pscp -h hosts.txt ./hostname.sh /home/test

4、批量授予hostname.sh可执行权限
pssh -h hosts.txt -i 'chmod +x /home/test/hostname.sh'

5、批量执行hostname.sh
pssh -h hosts.txt -i 'sudo sh /home/test/hostname.sh'
报错:Stderr: hostname: you must be root to change the host name
命令修改为:pssh -h hosts.txt -i 'sudo sh /home/test/hostname.sh'
执行成功。

批量替换sources.list

1、新建sources.list,内容为:

 

deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse  
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse  
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse  
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse  
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse  
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse  
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse  
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse  
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse  
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

2、客户机备份原sources.list
pssh -h hosts.txt -i 'sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak'

3、复制新的sources.list到客户机
pscp -h hosts.txt sources.list /home/test/
pssh -h hosts.txt 'sudo mv /home/test/sources.list /etc/apt/'

4、更新安装源
pssh -h hosts.txt -i 'sudo apt-get update'

批量安装ganglia

参考Ubuntu14.04安装配置Ganglia,假设我们已经配置好了ganglia主节点。

1、把ganglia主节点的/etc/ganglia/gmond.conf文件拷贝到管理机当前目录。

2、编写ganglia安装脚本install-gmond.sh(不要照抄,下面有修改版)

 

#!/bin/bash
sudo apt-get -y install ganglia-monitor rrdtool && \
sudo mv /etc/ganglia/gmond.conf /etc/ganglia/gmond.conf.bak && \
sudo mv /home/test/gmond.conf /etc/ganglia/ && \
sudo /etc/init.d/ganglia-monitor restart && \
sudo rm -rf /home/test/install-gmond.sh

3、拷贝gmond.conf和install-gmond.sh到客户机
pscp -h hosts.txt gmond.conf /home/test/
pscp -h hosts.txt install-gmond.sh /home/test/

4、添加执行权限
pssh -h hosts.txt -i 'chmod +x /home/test/install-gmond.sh'

5、执行安装
pssh -h hosts.txt -i 'sudo apt-get update'

pssh -h hosts.txt -i 'sudo sh /home/test/install-gmond.sh'

脚本虽然顺利执行了,但是报错:Stderr: debconf: unable to initialize frontend: Dialog
解决办法是修改脚本为:

 

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true && \
sudo apt-get -y -q install ganglia-monitor rrdtool && \
sudo mv /etc/ganglia/gmond.conf /etc/ganglia/gmond.conf.bak && \
sudo mv /home/test/gmond.conf /etc/ganglia/ && \
sudo /etc/init.d/ganglia-monitor restart && \
sudo rm -rf /home/test/install-gmond.sh

6、查看运行状态
pssh -h hosts.txt -i -o /tmp/pssh/ 'ps aux | grep ganglia'

批量修改密码

参考shell实现SSH自动登陆 和 6个Expect脚本示例,使用expect命令。

1、管理机上新建chpasswd.sh脚本,内容如下:

 

#!/usr/bin/expect set timeout 3set user testset password 123456spawn sudo passwd $user  
expect "Enter new UNIX password:"  send "${password}\r"  expect "Retype new UNIX password:"  send "${password}\r"  expect eof

2、在客户机上安装expect(可以用whereis expect查看是否安装)
pssh -h hosts.txt -i 'sudo apt-get install expect -y'

3、拷贝chpasswd.sh脚本到客户机
pscp -h hosts.txt chpasswd.sh /home/test

5、添加执行权限
pssh -h hosts.txt -i 'sudo chmod a+x /home/test/chpasswd.sh'

5、执行修改密码
pssh -h hosts.txt -i 'sudo /home/test/chpasswd.sh'

6、删除chpasswd.sh脚本
pssh -h hosts.txt -i 'sudo rm -rf /home/test/chpasswd.sh'

批量杀进程

假设需要杀死的进程为gmond。
方法一:
pnuke -h hosts.txt gmond
pssh -h hosts.txt -i 'ps -ef | grep gmond'
这种方法虽然显示success,但是查看进程依然存在,看来存在不确定性。猜测对于sudo启动的进程难以杀死。

方法二:
pssh -h hosts.txt -i 'sudo pkill -9 gmond'
这种方法杀的很彻底,是个好方法。

方法三:
pssh -h hosts.txt 'sudo ps -ef | grep gmond | awk '{print $2}' | xargs kill -9'
这种方法也显示success,但是查看进程依然存在,还是有问题。猜测因为sudo作用在了ps上,所以对于sudo启动的进程难以杀死。

方法四:

 

pssh -h hosts.txt -i 'sudo kill -s 9 `pgrep gmond`'

这种方法杀的很彻底,是个好方法。

PS:启动gmond命令pssh -h hosts.txt -i 'sudo /etc/init.d/ganglia-monitor start

后记

以上实践,已经包含了pssh的最常见用法。更高级的用法,就在需要时再去学习吧!



转载请标明出处【轻量级运维利器pssh、pdsh和mussh的使用以及区别】。

《www.micoder.cc》 虚拟化云计算,系统运维,安全技术服务.

网站已经关闭评论