一、pssh
pssh
是一个 python 编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,类似 pdsh
。为方便操作,使用前请在各个服务器上配置好密钥认证访问。项目地址: parallel-ssh
yum安装
yum install pssh
编译安装
wget http://parallel-ssh.googlecode.com/files/pssh-2.3.1.tar.gz tar xf pssh-2.3.1.tar.gz cd pssh-2.3.1/ python setup.py install
选项
--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:打印出服务器返回信息
用法
获取每台服务器的uptime: $ pssh -h ip.txt -i uptime 输入密码获取每台服务器的磁盘挂载信息 $ pssh -i -h hosts -l root -A -OStrictHostKeyChecking=no lsblk 查看每台服务器上mysql复制IO/SQL线程运行状态信息: $ pssh -h IP.txt -i "/usr/local/mysql/bin/mysql -e 'show slave status \G'"|grep Running: 保存每台服务器运行的结果: # pssh -h IP.txt -i -o /tmp/pssh/ uptime
pssh工具包
pssh工具包主要有5个程序: pssh 多主机并行运行命令 pscp 传输文件到多个hosts,他的特性和scp差不多 prsync 使用rsync协议从本地计算机同步到远程主机 pslurp 从多台远程机器拷贝文件到本地 pnuke kill远程机器的进程 1.pssh 多主机并行运行命令 [root@server pssh-2.2.2]# pssh -P -h test.txt uptime 192.168.9.102: 14:04:58 up 26 days, 17:05, 0 users, load average: 0.07, 0.02, 0.00 192.168.9.102: [1] 14:04:58 [SUCCESS] 192.168.9.102 9922 192.168.8.171: 14:04:59 up 35 days, 2:01, 6 users, load average: 0.00, 0.00, 0.00 192.168.8.171: [2] 14:04:59 [SUCCESS] 192.168.8.171 22 192.168.9.104: 14:04:59 up 7 days, 20:59, 0 users, load average: 0.10, 0.04, 0.01 192.168.9.104: [3] 14:04:59 [SUCCESS] 192.168.9.104 9922 [root@server pssh-2.2.2]# cat test.txt 192.168.9.102:9922 192.168.9.104:9922 192.168.8.171:22 //注意我的端口号不仅是默认的22 假如想将输出重定向到一个文件 加-o file 选项 2.pscp 把文件并行地复制到多个主机上 注意 是从服务器端给客户端传送文件: [root@server pssh-2.2.2]# pscp -h test.txt /etc/sysconfig/network /tmp/network //标示将本地的/etc/sysconfig/network传到目标服务器的/tmp/network 3.prsync 使用rsync协议从本地计算机同步到远程主机 [root@server ~]# pssh -h test.txt -P mkdir /tmp/etc [root@server ~]# prsync -h test.txt -l dongwm -a -r /etc/sysconfig /tmp/etc //标示将本地的/etc/sysconfig目录递归同步到目标服务器的 /tmp/etc目录下,并保持原来的时间戳,使用用户 dongwm 4.pslurp 将文件从远程主机复制到本地,和pscp方向相反: [root@server ~]# pslurp -h test.txt -L /tmp/test -l root /tmp/network test //标示将目标服务器的/tmp/network文件复制到本地的/tmp/test目录下,并更名为test [1] 14:53:54 [SUCCESS] 192.168.9.102 9922 [2] 14:53:54 [SUCCESS] 192.168.9.104 9922 [root@server ~]# ll /tmp/test/192.168.9.10 192.168.9.102/ 192.168.9.104/ [root@server ~]# ll /tmp/test/192.168.9.102/ 总计 4.0K -rw-r--r-- 1 root root 60 2011-04-22 14:53 test [root@server ~]# ll /tmp/test/192.168.9.104/ 总计 4.0K -rw-r--r-- 1 root root 60 2011-04-22 14:53 test 5.pnuke 并行在远程主机杀进程: [root@server ~]# pnuke -h test.txt syslog //杀死目标服务器的syslog进程,只要ps进程中出现相关词语 都能杀死 [1] 15:05:14 [SUCCESS] 192.168.9.102 9922 [2] 15:05:14 [SUCCESS] 192.168.9.104 9922
二、pdsh
pdsh
(Parallel Distributed SHell) 可并行的执行对目标主机的操作,对于批量执行命令和分发任务有很大的帮助,在使用前需要配置 ssh 无密码登录,点击下载
2.1、pdsh 基本用法
$ pdsh -h
Usage: pdsh [-options] command ...
-S return largest of remote command return values
-h output usage menu and quit 获取帮助
-V output version information and quit 查看版本
-q list the option settings and quit 列出 `pdsh` 执行的一些信息
-b disable ^C status feature (batch mode)
-d enable extra debug information from ^C status
-l user execute remote commands as user 指定远程使用的用户
-t seconds set connect timeout (default is 10 sec) 指定超时时间
-u seconds set command timeout (no default) 类似 `-t`
-f n use fanout of n nodes 设置同时连接的目标主机的个数
-w host,host,... set target node list on command line 指定主机,host 可以是主机名也可以是 ip
-x host,host,... set node exclusion list on command line 排除某些或者某个主机
-R name set rcmd module to name 指定 rcmd 的模块名,默认使用 ssh
-N disable hostname: labels on output lines 输出不显示主机名或者 ip
-L list info on all loaded modules and exit 列出 `pdsh` 加载的模块信息
-a target all nodes 指定所有的节点
-g groupname target hosts in dsh group "groupname" 指定 `dsh` 组名,编译安裝需要添加 `-g` 支持选项 `--with-dshgroups`
-X groupname exclude hosts in dsh group "groupname" 排除组,一般和 `-a` 连用
available rcmd modules: exec,xcpu,ssh (default: ssh) 可用的执行命令模块,默认为 ssh
2.2、使用实例
2.2.1、单个主机测试
$ pdsh -w 192.168.0.231 -l root uptime
192.168.0.231: 16:16:11 up 32 days, 22:14, ? users, load average: 0.10, 0.14, 0.16
2.2.2、多个主机测试
$ pdsh -w 192.168.0.[231-233] -l root uptime
192.168.0.233: 16:17:05 up 32 days, 22:17, ? users, load average: 0.13, 0.12, 0.10
192.168.0.232: 16:17:05 up 32 days, 22:17, ? users, load average: 0.45, 0.34, 0.27
192.168.0.231: 16:17:06 up 32 days, 22:15, ? users, load average: 0.09, 0.13, 0.15
2.2.3、逗号分隔主机
$ pdsh -w 192.168.0.231,192.168.0.234 -l root uptime
192.168.0.234: 16:19:44 up 32 days, 22:19, ? users, load average: 0.17, 0.21, 0.20
192.168.0.231: 16:19:44 up 32 days, 22:17, ? users, load average: 0.29, 0.18, 0.16
2.2.4、-x
排除某个主机
$ pdsh -w 192.168.0.[231-233] -x 192.168.0.232 -l root uptime
192.168.0.233: 16:18:24 up 32 days, 22:19, ? users, load average: 0.11, 0.12, 0.09
192.168.0.231: 16:18:25 up 32 days, 22:16, ? users, load average: 0.11, 0.13, 0.15
2.2.5、主机组
对于 -g
组,把对应的主机写入到 /etc/dsh/group/
或 ~/.dsh/group/
目录下的文件中即可,文件名就是对应组名
$ cat ~/.dsh/group/dsh-test
192.168.0.231
192.168.0.232
192.168.0.233
192.168.0.234
$ pdsh -g dsh-test -l root uptime
192.168.0.232: 16:21:38 up 32 days, 22:22, ? users, load average: 0.01, 0.15, 0.21
192.168.0.231: 16:21:38 up 32 days, 22:19, ? users, load average: 0.17, 0.16, 0.16
192.168.0.234: 16:21:39 up 32 days, 22:21, ? users, load average: 0.15, 0.19, 0.19
192.168.0.233: 16:21:40 up 32 days, 22:22, ? users, load average: 0.15, 0.15, 0.10
2.2.6、dshbak
格式化输出
pdsh
的缺省输出格式为主机名加该主机的输出,在主机或输出多时会比较混乱,可以采用 dshbak
做一些格式化,让输出更清晰。
$ pdsh -g dsh-test -l root 'date' # 查看哪些主机时间不一样,主机一多,可读性不强
192.168.0.232: Wed Jun 19 16:24:40 CST 2013
192.168.0.231: Wed Jun 19 16:24:40 CST 2013
192.168.0.234: Wed Jun 19 16:24:40 CST 2013
192.168.0.233: Wed Jun 19 16:24:40 CST 2013
使用 dshbak
之后可读性变得好了很多
$ pdsh -g dsh-test -l root 'date' | dshbak -c
----------------
192.168.0.[231-232,234]
----------------
Wed Jun 19 16:24:18 CST 2013
----------------
192.168.0.233
----------------
Wed Jun 19 16:24:19 CST 2013