返回介绍

6.1 并行 SSH 运维工具 pssh

发布于 2025-04-21 21:33:22 字数 7229 浏览 0 评论 0 收藏

随着企业 IT 基础架构规模不断扩张,业务也迅速扩大,企业运维人员要管理的服务器和业务系统也迅速增加,从之前的几十台增加到上百台甚至几千台。面对这么多的服务器,要执行相同的系统配置操作,一台一台地部署显然是不现实的,而通过写 shell 脚本来完成,效率又十分低下,此时就需要一些自动化运维工具来批量完成。本章重点介绍三个轻量级运维利器,分别是 pssh、pdsh 和 mussh,这三个工具小巧、使用简单,但功能强大,可以为自动化运维提供强有力的支持。

6.1.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 user001 date 

这里以 user001 主机为例,其他主机依此类推,如果不需要输入密码就出现系统当前日期,说明 SSH 单向信任已经配置成功了。

6.1.2 pssh 的安装与用法

pssh 要求 Python 版本大于 2.4 即可。大家可以到 http://code.google.com/p/parallel-ssh/下载 pssh 的各种版本,目前最新版本是 pssh-2.3.1。这里下载的是 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 命令的详细用法,表 6-1 是 pssh 常用的参数以及语法介绍。

表 6-1 pssh 命令的常用参数以及含义

这里重点介绍了 pssh 命令的一些常用参数,而其他四个命令 pscp、prsync、pnuke 和 pslurp 的参数含义与用法与 pssh 命令基本相同,因此这里不再过多介绍。

6.1.3 pssh 应用实例

pssh 命令的使用非常灵活,可以根据实际的应用需要选择对应的命令工具,例如,要在远程主机上批量执行一些信息统计命令,就可以通过 pssh 命令来完成。而要将一些文件传输到远程的多台主机上,或者将远程主机的某些文件复制到本地主机时,就需要使用 pscp 命令和 pslurp 命令了,如果要传输某些文件夹到远程多台主机上时,就必须选择 prsync 命令了。

1.pssh 批量查看远程主机信息

通过 pssh 命令查看远程主机 user002 和 user003 上面的时间信息,实现过程如图 6-1 所示。

图 6-1 通过 pssh 命令查看 user002 和 user003 服务器上的时间信息

在这个操作中,通过“-H”参数指定远程的单台主机,另外,通过这个操作可以很清楚地看到“-P”参数与“-i”参数的差别。

pssh 命令更多的用途是批量管理服务器,下面的例子演示的就是批量查看远程多台服务器的负载状况,如图 6-2 和图 6-3 所示。

图 6-2 远程服务器列表

图 6-3 通过 pssh 获取的远程服务器负载信息

这个操作中用到了“-O”参数,后面跟的“StrictHostKeyChecking=no”是 sshd 服务的配置文件 ssh_config 中的一个选项,通过设置这个参数,可以让远程主机自动接受本地主机的 hostkey,而不用每次都要手动输入 yes。后面还用到了“-h”参数,通过这个参数可以指定一个需要连接的服务器列表,文件内容如图 6-2 所示。在这个文件中省略了用户名和连接端口,那么 pssh 将自动使用当前用户 opsuser 和默认端口 22。

从图 6-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”,用于指定在远程主机上登录的用户名和 SSH 端口,而“-o”参数指定将输出结果存放到/etc/pssh/info 目录中。在此实例的最后指定了要在远程主机上执行的命令,可以指定多个命令,每个命令之间用分号隔开。

2.pscp 与 pslurp 应用实例

pscp 命令的主要作用是将本地文件并行地复制到远程多台主机上,而 pslurp 是把文件从远程多台主机复制到本地主机,这两个命令的功能刚好相反。在运维工作中,需要进行文件批量传送时,这两个命令非常有用。

首先看 pscp 的两个应用实例,如图 6-4 所示。

图 6-4 pscp 应用实例

图 6-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 的两个应用实例,如图 6-5 所示。

图 6-5 pslurp 应用实例

图 6-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 所示。

图 6-6 pslurp 复制远程文件结构图

3.prsync 与 pnuke 应用实例

prsync 的主要作用是通过 rsync 协议将文件或目录从本地主机同步到远程多个主机上,先看 prsync 的两个应用实例,如图 6-7 所示。

图 6-7 prsync 应用实例

图 6-7 的第一个实例中使用了“-l”、“-a”和“-r”参数,其中“-l”用于指定远程主机上的用户,“-r”用于递归复制指定目录下的所有文件,这两个参数前面已经介绍过,而“-a”参数可以维持文件的属性值不变,例如文件的创建时间、修改时间、读写权限等,这个参数在做目录复制时非常有用,建议使用。

第二个实例中又引入了“-z”参数,这是一个压缩传输参数,在低带宽环境下,或者在对网络带宽有要求、传输文件压缩率比较大时使用。而在带宽充足或传输的文件比较大时,不推荐使用。

pnuke 的主要作用是在远程多主机上并行杀掉某一进程,相当于 killall 命令。它的用法非常简单,最简单的用法如下:

[opsuser@server ~]$ pnuke -h /etc/pssh/hosts httpd

这个命令将在远程所有主机上并行关闭 httpd 服务,pnuke 的作用类似于 killall,而后面跟的 httpd 是服务名,其实只要通过 killall 命令能关闭的服务,都可以通过 pnuke 来批量完成。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。