- 前言
- 为什么要写这本书
- 读者对象
- 如何阅读本书
- 勘误和支持
- 致谢
- 第一部分 安全运维篇
- 第 1 章 Linux 服务器安全运维
- 第 2 章 Linux 网络安全运维
- 第 3 章 数据安全工具 DRBD、extundelete
- 第二部分 运维故障排查篇
- 第 4 章 Linux 系统运维故障排查思路
- 第 5 章 Linux 故障排查案例实战
- 第三部分 自动化运维篇
- 第 6 章 轻量级运维利器 pssh、pdsh 和 mussh
- 第 7 章 分布式监控系统 Ganglia
- 第 8 章 基于 nagios 的分布式监控报警平台 Centreon
- 第 9 章 通过 Ganglia 与 Centreon 构建智能化监控报警平台
- 第四部分 集群架构篇
- 第 10 章 高性能 Web 服务器 Nginx
- 第 11 章 高性能集群软件 Keepalived
- 第 12 章 千万级高并发负载均衡软件 HAProxy
- 第 13 章 构建高性能的 MySQL 集群系统
- 第 14 章 高性能负载均衡集群软件 HAProxy
6.1 并行 SSH 运维工具 pssh
随着企业 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论