随着企业IT基础架构规模不断扩张,业务也迅速扩大,企业人员要管理的和业务系统也迅速增加,从之前的几十台增加到上百台甚至几千台。面对这么多的,要执行相同的系统配置操作,一台一台地部署显然是不现实的,而通过写脚本来完成,效率又十分低下,此时就需要一些自动化工具来批量完成。本文介绍轻量级利器pssh,工具小巧、使用简单,但功能强大,可以为自动化提供强有力的支持。
1、pssh应用场景
pssh的全称是parallel-ssh,是一个用 Python 编写的可以并发在多台 服务器 上批量执行命令的工具,它支持文件并行复制、 远程 并行执行命令、杀掉 远程 上的 进程 等。其中,文件并行复制是pssh核心功能,也是同类工具中最大的亮点,因此,要批量在 远程 主机 上传、下载文件时,最好选用pssh这个 服务器 批量管理工具。
要使用pssh工具包,必须保证本地和要管理的之间的单向信任,也就是要在本地和所有上配置密钥认证访问。创建本地和之间的单向信任非常简单,下面以创建本地用户opsuser和所有上opsuser用户之间的信任为例介绍配置的基本过程。
(1)在本地主机上创建RSA密钥和公钥
1)在本地 主机 上以opsuser用户登录。
2)在opsuser用户的根目录内创建.ssh目录并设置读取权限。
[opsuser@server ~]$ mkdir ~/.ssh
[opsuser@server ~]$ chmod 700 ~/.ssh
3)使用ssh-keygen命令生成基于SSH协议的RSA密钥。
[opsuser@server ~]$ cd ~/.ssh
[opsuser@server ~]$ ssh-keygen -t rsa
在提示保存私钥(key)和公钥(public key)的位置时,选择默认值,然后依次按回车键即可。
(2)整合公钥文件
在本地 主机 上以opsuser用户登录,执行如下操作:
[opsuser@server ~]$ cd ~/.ssh
[opsuser@server ssh]$ cat /home/opsuser/.ssh/id_rsa.pub > authorized_keys
[opsuser@server ssh]$ chmod 600 ~/.ssh/authorized_keys
[opsuser@server ssh]$ scp authorized_keys user001:/home/opsuser/.ssh/
这个操作过程是将本地节点生成的公钥文件整合为一个authorized_keys文件,然后进行授权,并将authorized_keys复制到所有上。这里以user001为例。
(3)测试SSH密钥认证
在本地 主机 上执行如下命令:
[opsuser@server ssh]$ ssh user001 date
这里以user001为例,其他依此类推,如果不需要输入就出现系统当前日期,说明SSH单向信任已经配置成功了。
2、pssh的安装与用法
pssh要求 Python 版本大于2.4即可。这里下载的是pssh-2.3.1.tar.gz,安装过程如下:
[root@server ~]# tar zxvf pssh-2.3.1.tar.gz
[root@server ~]# cd pssh-2.3.1
[root@server pssh-2.3.1]# python setup.py install
安装完成的pssh工具包附带了5个主程序,分别是:
parallel ssh(pssh),在多台上并行运行命令。
parallel scp(pscp),把文件并行复制到多台上,类似于scp命令。
parallel rsync(prsync),使用rsync协议将文件从本地同步到多台上。
parallel nuke(pnuke),在多台上并行killall某一。
parallel slurp(pslurp),把文件从多台复制到本地,与pscp命令相反。
完成pssh安装后,执行“pssh--help”命令即可显示pssh命令的详细用法,表1是pssh常用的参数以及语法介绍。
表1 pssh命令的常用参数以及含义
3、pssh应用实例
pssh命令的使用非常灵活,可以根据实际的应用需要选择对应的命令工具,例如,要在 远程 上批量执行一些信息统计命令,就可以通过pssh命令来完成。而要将一些文件传输到 远程 的多台 主机 上,或者将 远程 主机 的某些文件复制到本地 主机 时,就需要使用pscp命令和pslurp命令了,如果要传输某些文件夹到 远程 多台 主机 上时,就必须选择prsync命令了。
(1)pssh批量查看远程主机信息
通过pssh命令查看user002和user003上面的时间信息,实现过程如图1所示。
图1 通过pssh命令查看user002和user003服务器上的时间信息
在这个操作中,通过“-H”参数指定的单台,另外,通过这个操作可以很清楚地看到“-P”参数与“-i”参数的差别。
pssh命令更多的用途是批量管理,下面的例子演示的就是批量查看多台的负载状况,如图2和图3所示。
图2 远程服务器列表
图3 通过pssh获取的远程服务器负载信息
这个操作中用到了“-O”参数,后面跟的“StrictHostKeyChecking=no”是sshd服务的配置文件ssh_config中的一个选项,通过设置这个参数,可以让自动接受本地的hostkey,而不用每次都要手动输入yes。后面还用到了“-h”参数,通过这个参数可以指定一个需要连接的列表,文件内容如图2所示。在这个文件中省略了用户名和连接端口,那么pssh将自动使用当前用户opsuser和默认端口22。
从图3的输出结果看,获取的负载信息不是按照列表的顺序显示的,这刚好说明pssh的并发执行特性。
pssh可调用tar命令解压上的文件,例如:
[opsuser@server ~]$ pssh -i -h /etc/pssh/hosts "tar -zxvf hadoop-2.0.0-cdh4.5.0.tar.gz"
在这个例子中,pssh默认解压的是上/home/opsuser/hadoop-2.0.0-cdh4.5.0.tar.gz文件,而要解压root用户下的文件,可以执行如下操作:
[opsuser@server ~]$ pssh -i -h /etc/pssh/hosts > "sudo "tar -zxvf /mnt/hadoop-2.0.0-cdh4.5.0.tar.gz -c /mnt" "
在这个例子中,pssh调用了“sudo”命令,因此,要操作具有root权限的文件时,opsuser用户在上必须开通可通过sudo命令切换到root用户的权限。
pssh也可批量删除上指定的文件或目录,例如:
[opsuser@server ~]$ pssh -i -h /etc/pssh/hosts > "sudo "rm -rf /mnt/hadoop-2.0.0-cdh4.5.0" "
类似的例子有很多,比如通过pssh还可以在上安装软件、启动系统服务等,看下面两个例子:
[opsuser@server ~]$ pssh -i -h /etc/pssh/hosts "sudo "yum -y install pssh" "
[opsuser@server ~]$ pssh -i -h /etc/pssh/hosts "sudo "/etc/init..d/gmond start" "
下面这个操作是pssh的综合应用实例:
[opsuser@server ~]$ pssh -i -x "-l opsuser" "-p 9529" -h /etc/pssh/hosts > -o /etc/pssh/info "uptime;uname -a"
这个实例用到了“-x”参数,分别调用了ssh命令的两个参数“-l”和“-p”,用于指定在上登录的用户名和端口,而“-o”参数指定将输出结果存放到/etc/pssh/info目录中。在此实例的最后指定了要在上执行的命令,可以指定多个命令,每个命令之间用分号隔开。
(2)pscp与pslurp应用实例
pscp命令的主要作用是将本地文件并行地复制到多台上,而pslurp是把文件从 多台复制到本地,这两个命令的功能刚好相反。在工作中,需要进行文件批量传送时,这两个命令非常有用。
首先看pscp的两个应用实例,如图4所示。
图4 pscp应用实例
图4中第一个例子是将本地上的/etc/ssh/ssh_config文件复制到的/tmp目录下,这是pscp最简单的用法,如果要复制的文件比较多,一个一个执行就非常麻烦,此时可以通过复制目录的方式实现。第二个例子就是将本地的/etc/httpd/conf目录复制到的/tmp目录下,在进行目录复制时,用到了“-r”参数,表示递归地复制指定目录下的所有文件。这里需要注意权限问题,指定上的目标路径一定是当前用户可读写的,否则会发生错误。
完成复制后,在上查看复制过来的目录,结构如下:
[opsuser@user001 ~]$ ls -ld /tmp/conf drwxr -xr-x 2 opsuser opsuser 4096 Jan 5 16:06 /tmp/conf
接下来再看pslurp的两个应用实例,如图5所示。
图5 pslurp应用实例
图5中第一个例子是将所有上的/home/opsuser/gmond.conf文件复制到本地的/home/opsuser/test目录下,并将文件改名为gmond1.conf,这里面用到了“-L”参数,用来指定本地路径,这个路径是个目录,用于存储从传输过来的文件。第二个例子是将所有上的/home/opsuser/gmond目录复制到本地的/home/opsuser/test目录下,并将复制过来的目录改名为gmond1,这里面也用到了“-r”和“-L”参数,需要注意这两个参数的顺序不能颠倒。
完成数据复制后,在本地的/home/opsuser/test目录下存放着所有以名命名的目录,这里以user001为例,查看复制过来的文件,结果如图6所示。
图6 pslurp复制远程文件结构图
(3)prsync与pnuke应用实例
prsync的主要作用是通过rsync协议将文件或目录从本地同步到多个上,先看prsync的两个应用实例,如图7所示。
图7 prsync应用实例
图7的第一个实例中使用了“-l”、“-a”和“-r”参数,其中“-l”用于指定上的用户,“-r”用于递归复制指定目录下的所有文件,“-a”参数可以维持文件的属性值不变,例如文件的创建时间、修改时间、读写权限等,这个参数在做目录复制时非常有用,建议使用。
第二个实例中又引入了“-z”参数,这是一个压缩传输参数,在低带宽环境下,或者在对网络带宽有要求、传输文件压缩率比较大时使用。而在带宽充足或传输的文件比较大时,不推荐使用。
pnuke的主要作用是在 远程 多 主机 上并行杀掉某一 进程 ,相当于killall命令。 它的用法非常简单,最简单的用法如下:
[opsuser@server ~]$pnuke -h /etc/pssh/hosts httpd
这个命令将在所有上并行关闭httpd服务,pnuke的作用类似于killall,而后面跟的httpd是服务名,其实只要通过killall命令能关闭的服务,都可以通过pnuke来批量完成。