PSSH(parallel-ssh,并行的ssh) 提高工作效率

PSSH 官网https://github.com/ParallelSSH/parallel-ssh

parallel-ssh

Asynchronous parallel SSH client library.

Run SSH commands over many - hundreds/hundreds of thousands - number of servers asynchronously and with minimal system load on the client host.

Native code based client with extremely high performance - based on libssh2 C library.

 

我们经常需要ssh到多个主机上执行相同的命令,为了提高效率,我们通常会自己写个脚本,循环遍历执行我们的命令,比如:

for host in `cat hosts.txt`;do
    ssh username@$host -p port cmd
done

采用这种方式的问题是:

1)必须自己写脚本,且正确性没法保证。

2)各个主机执行任务是串行的,必须前一台主机执行完毕后,下一台主机才能执行,难以实现并行执行。

我们可以使用parallel-ssh工具来实现并行ssh远程执行命令,它是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,目标也是简化大量计算机的管理,项目地址:https://code.google.com/p/parallel-ssh/

pssh 包安装5个实用程序:parallel-ssh、parallel-scp、parallel-rsync、parallel-slurp、parallel-nuke  每个实用程序都并行地操作多个主机。

1)parallel-ssh 在多个主机上并行地运行命令。

2)parallel-scp 把文件并行地复制到多个主机上。(全量拷贝

3)parallel-rsync 通过 rsync 协议把文件高效地并行复制到多个主机上。(增量拷贝

4)parallel-slurp 把文件并行地从多个远程主机复制到中心主机上。

5)parallel-nuke 并行地在多个远程主机上杀死进程。

 

pssh 安装

只需要在主节点上安装pssh,系统中已经安装有python,pip

pip install parallel-ssh

源码下载、解压、安装

github 下载源码:https://github.com/ParallelSSH/parallel-ssh/releases

wget https://github.com/ParallelSSH/parallel-ssh/archive/1.9.1.tar.gz

wget http://parallel-ssh.googlecode.com/files/pssh-2.3.1.tar.gz

tar -xvf parallel-ssh-1.9.1.tar.gz
cd parallel-ssh-1.9.1
python setup.py build
python setup.py install

 

使用它首先需要安装,ubuntu已经集成到软件包中,直接使用apt-get安装:

sudo apt-get install pssh    // Ubuntu

yum -y install pssh           // Linux (CentOS)

brew install pssh            // MacOS(不可用,请用上面的源码安装)

 

为了简便,设置以下alias:

alias pssh='parallel-ssh'
alias pscp='parallel-scp'

 

pssh 帮助命令

# pssh --help
Usage: pssh [OPTIONS] command [...]

Options:
  --version             show program's version number and exit
  --help                show this help message and exit
  -h HOST_FILE, --hosts=HOST_FILE
                        hosts file (each line "[user@]host[:port]")
  -H HOST_STRING, --host=HOST_STRING
                        additional host entries ("[user@]host[:port]")
  -l USER, --user=USER  username (OPTIONAL)
  -p PAR, --par=PAR     max number of parallel threads (OPTIONAL)
  -o OUTDIR, --outdir=OUTDIR
                        output directory for stdout files (OPTIONAL)
  -e ERRDIR, --errdir=ERRDIR
                        output directory for stderr files (OPTIONAL)
  -t TIMEOUT, --timeout=TIMEOUT
                        timeout (secs) (0 = no timeout) per host (OPTIONAL)
  -O OPTION, --option=OPTION
                        SSH option (OPTIONAL)
  -v, --verbose         turn on warning and diagnostic messages (OPTIONAL)
  -A, --askpass         Ask for a password (OPTIONAL)
  -x ARGS, --extra-args=ARGS
                        Extra command-line arguments, with processing for
                        spaces, quotes, and backslashes
  -X ARG, --extra-arg=ARG
                        Extra command-line argument
  -i, --inline          inline aggregated output and error for each server
  --inline-stdout       inline standard output for each server
  -I, --send-input      read from standard input and send as input to ssh
  -P, --print           print output as we get it

Example: pssh -h hosts.txt -l irb2 -o /tmp/foo uptime

 

编写需要远程操作的host列表hosts.txt:

node1
node2
node3
...
node100

使用时需要指定用户名和输入用户密码(必须所有主机的用户和密码相同)以及远程主机列表,

通过-l username选项指定用户名,使用-A选项指定需要输入密码,使用-h指定主机列表,比如在所有的主机执行uptime操作:

pssh -P -l foo -A -h hosts.txt uptime

 

若我们当前主机的登录名为fgp,且fgp能够免密码登录hosts.txt的所有主机,则可以省略用户名和密码。比如,所有的主机执行uptime操作,并打印结果:

pssh -P -h hosts.txt uptime

 

主机太多了,把输出保存到文件中:

pssh -o uptime_result -h hosts.txt uptime

 

传输本地文件到所有的主机中:

pscp -h hosts.txt local_file.txt ~/target_file.txt

 

PSSH配置

配置主要有两项内容:

1)从结点的IP列表文件

2)主节点到从节点的ssh无密钥登录

IP列表文件就是将从结点的IP按行存在一个文件里,给它命名为host_list.txt,里面共有99行,第一行172.16.0.2

下面是ssh无密钥登录

由于好多很多操作需要有sudo权限,所以尽量ssh无密钥登录到从节点的root用户下,详见米扑博客:Linux ssh 切换登录用户自动转到root用户

ssh-keygen   (然后按提示输入信息)

ssh-copy-id  –i ~/.ssh/id_rsa.pub root@172.16.0.2 (将密钥复制到从节点,需要输入密码)

PSSH使用

命令格式:

pscp -h host_list.txt -r source_file_path destination_file_path

 

#例如将主节点的/home/master/1.txt拷贝到从节点的/home/slave/目录下

pscp -h host_list.txt -r /home/master/1.txt /home/slave/

 

#pscp是远程拷贝文件,如从主节点将文件分发到所有从节点

pssh -h host_list.txt -P "command"

 

#例如在从节点建立新目录/home/slave/test

pssh -h host_list.txt -P "mkdir /home/slave/test"

 

使用PSSH应该会的命令

pssh结合脚本使用比较高效,有以下几个命令可能会用到

sed

cat

重定向 >>与>

expect

以上是简单使用方法,掌握以上的这些操作足够完成我们大多数工作,提高工作效率。

 

 

Linux  parallel-ssh(PSSH)批量工具

作为数据中心运维,每天要面对无数的Linux系统服务器,每天可能都要远程连接很多台服务器来运行每天的管理任务。

例如 收集有关磁盘使用情况或运行进程的信息。如果您只想登录到一台服务器,然后将这些命令批量发送到其他远程服务器,能实现吗?

Parallel-SSH是一款能实现此功能的便捷工具。使用Parallel-SSH,您可以在Linux服务器上批量运行运行命令,这对于使用管理着多台服务器的管理员来说是一个福音。

这里将说明如何在Ubuntu Server 18.04平台上安装和使用Parallel-SSH。

一、安装

可以使用单个命令完成Parallel-SSH的安装。打开终端窗口并使用命令:

sudo apt-get install pssh

安装完成后,您就可以开始配置使用了。

 

二、配置命令

我们将创建一个文件,其中包含我们希望在远程服务器上运行的所有命令。使用命令:

sudo vim pssh-commands 

在该文件中,复制以下内容:

#!/bin/bash
#
# mimvp.com 
# 2018.08.08


echo
# show system uptime
uptime

echo
# show who is logged on and what they are doing
who

echo
# show top 5 processes by RAM usage
ps -eo cmd,pid,ppid,%mem,%cpu --sort=-%mem | head -n 6

exit 0

保存并关闭该文件。

注意:上面只是一个示例,您可以在上面的文件中添加所需的任何命令,例如:

ls /tmp/

cat /etc/passwd

 

三、创建主机文件

接下来,我们需要创建一个hosts文件。使用命令:

sudo vim pssh-hosts

在此文件中,主机将以user@IP的形式列出,每行一个,根据需要添加任意数量,如下所示:

mimvp@192.168.1.162

mimvp@192.168.1.221

保存并关闭该文件。

 

四、运行并行SSH

现在我们要运行命令,已准备好命令和主机文件,因此请使用以下命令以使用这些文件:

parallel-ssh -h pssh-hosts -A -P -I < pssh-command

以上命令功能如下:

-h - hostname(在本例中,我们使用的是主机文件)

-A 要求输入密码

-P 打印输出时

-I 读取输入并发送到每个ssh进程

系统将提示您输入与pssh-hosts中配置的用户关联的密码。经过身份验证后,您应该可以看到远程计算机上命令的成功输出(图A)。

您可以滚动查看命令的输出以收集有关服务器的信息。

 

 

ssh私钥批量部署认证以及pssh工具使用方法

在日常工作中,批量管理服务器是个力气活,如果人工一台一台处理,效率低下。此时,老外写的pssh工具实现了批量管理。

pssh的原理是先建立ssh私钥认证,然后用pssh工具批量管理。

下面,我写了一个批量部署ssh私钥认证的脚本。

vim batch_sshkey.sh

#!/bin/bash

cd /root
cat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keys

for i in `cat ip.txt`
do
	ip=$(echo "$i"|cut -f1 -d":")
	password=$(echo "$i" | cut -f2 -d":")

	expect -c "
	spawn scp /root/.ssh/authorized_keys /root/remote_operate.sh  root@$ip:/tmp/
	        expect {
	                \"*yes/no*\" {send \"yes\r\"; exp_continue}
	                \"*password*\" {send \"$password\r\"; exp_continue}
	                \"*Password*\" {send \"$password\r\";}
	        }
	"

	expect -c "
	spawn ssh root@$ip "/tmp/remote_operate.sh"
	        expect {
	                \"*yes/no*\" {send \"yes\r\"; exp_continue}
	                \"*password*\" {send \"$password\r\"; exp_continue}
	                \"*Password*\" {send \"$password\r\";}
	        }
	"
done

 

vim ip.txt(前面是IP,后面是密码,用冒号:分割)

192.168.8.23:123456
192.168.8.24:456789

 

vim remote_operate.sh

#!/bin/bash

if [ ! -d /root/.ssh ];then 
mkdir /root/.ssh
fi
cp /tmp/authorized_keys /root/.ssh/

 

运行 batch_sshkey.sh 即可

chmod +x batch_sshkey.sh
sh batch_sshkey.sh

 

下面介绍PSSH工具使用方法,使用很简单:

# yum -y install *Python*
#
# tar  zxvf pssh-1.4.3.tar.gz
# cd pssh-1.4.3
# python setup.py install

 

批量执行hostname命令

# pssh -h other.txt -l root -i hostname     
[1] 16:08:36 [SUCCESS] 192.168.110.122 22
Hadoop-namenode
[2] 16:08:36 [SUCCESS] 192.168.110.123 22
hadoop-secondnamenode
[3] 16:08:36 [SUCCESS] 192.168.110.203 22
EnvFactoryServer203
[4] 16:08:36 [SUCCESS] 192.168.110.202 22
EnvFactoryServer202
[5] 16:08:36 [SUCCESS] 192.168.251.43 22
SC-HOST-43
[6] 16:08:36 [SUCCESS] 192.168.251.42 22
SC-HOST-42
[7] 16:08:36 [SUCCESS] 192.168.0.106 22
PSA-Host-106
[8] 16:08:36 [SUCCESS] 192.168.0.105 22
PSA-HOST-105
[9] 16:08:36 [SUCCESS] 192.168.110.138 22
hadoop-datanode3
[10] 16:08:36 [SUCCESS] 192.168.110.252 22
zhuanxiang.liuxin
[11] 16:08:36 [SUCCESS] 192.168.110.137 22
hadoop-datanode2
[12] 16:08:36 [SUCCESS] 192.168.110.140 22
hadoop-datanode5
[13] 16:08:36 [SUCCESS] 192.168.110.139 22
hadoop-datanode4
[14] 16:08:36 [SUCCESS] 192.168.110.213 22
SiteA-APP-01
[15] 16:08:36 [SUCCESS] 192.168.110.141 22
hadoop-datanode6
[16] 16:08:36 [SUCCESS] 192.168.0.100 22
SC-Host-100
[17] 16:08:36 [SUCCESS] 192.168.110.124 22
hadoop-datanode1
[18] 16:08:37 [SUCCESS] 192.168.0.101 22
SC-Host-101

 

批量拷贝本地文件nrpe.tgz到远端服务器

# pscp -h other.txt -l root /home/soft/nrpe.tgz /usr/local/
[1] 16:11:21 [SUCCESS] 192.168.110.123 22
[2] 16:11:22 [SUCCESS] 192.168.251.43 22
[3] 16:11:23 [SUCCESS] 192.168.110.202 22
[4] 16:11:23 [SUCCESS] 192.168.110.140 22
[5] 16:11:23 [SUCCESS] 192.168.110.138 22
[6] 16:11:25 [SUCCESS] 192.168.110.203 22
[7] 16:11:25 [SUCCESS] 192.168.110.213 22
[8] 16:11:26 [SUCCESS] 192.168.0.101 22
[9] 16:11:26 [SUCCESS] 192.168.110.122 22
[10] 16:11:27 [SUCCESS] 192.168.0.105 22
[11] 16:11:28 [SUCCESS] 192.168.110.139 22
[12] 16:11:28 [SUCCESS] 192.168.110.141 22
[13] 16:11:28 [SUCCESS] 192.168.0.100 22
[14] 16:11:28 [SUCCESS] 192.168.110.124 22
[15] 16:11:29 [SUCCESS] 192.168.110.137 22
[16] 16:11:29 [SUCCESS] 192.168.0.106 22
[17] 16:11:30 [SUCCESS] 192.168.110.252 22
[18] 16:11:30 [SUCCESS] 192.168.251.42 22

 

查看文件 other.txt 

# more other.txt 
192.168.0.100
192.168.0.101
192.168.251.42
192.168.251.43
192.168.0.105
192.168.0.106
192.168.110.213
192.168.110.122
192.168.110.123
192.168.110.124
192.168.110.137
192.168.110.138
192.168.110.139
192.168.110.140
192.168.110.141
192.168.110.252
192.168.110.202
192.168.110.20

 

 

总结

Parallel-SSH唯一问题是它无法使用sudo运行命令。

如果你有root权限,这不是问题,但你可能已经将root用户锁定在ssh登录之外,所以仍然是个问题。

换句话说,您无法使用Parallel-SSH运行sudo apt-get upgrade之类的命令。这很好,因为你可能不想使用这样的工具来运行需要root或sudo权限的命令。

相反,您可以创建处理不同任务的各种命令文件(例如收集网络信息,磁盘信息,进程信息等)。

 

 

参考推荐

Linux ssh 命令原理详解

ssh + sshpass 自动输入密码登录服务器

Linux两台主机之间建立信任

Linux screen 命令详解

Linux lsof 命令详解

Linux top 命令详解

Linux 性能监控的18个命令行工具

Linux 修改SSH 默认端口 22,防止被破解密码

Linux 修改默认端口、增加普通用户、使用密钥等安全登录SSH

Linux ssh 切换登录用户自动转到root用户

Linux shell 脚本通过expect实现自动输入密码

Linux expect 命令无需输入密码登陆

Linux sudo 免密码输入

SecureCRT 自动登录设置

JumpServer 堡垒机环境搭建详解

Windows 连接 Linux 常用工具

Linux之/etc/profile、~/.bash_profile等几个文件的执行过程

自建服务器解决外网访问内网的端口穿透映射

LastPass 跨平台密码管理工具

nohup、&、disown、setsid、screen、jobs 后台运行命令区别