使用PDSH工具在多个主机上运行并行命令

时间:2020-03-05 15:26:15  来源:igfitidea点击:

PDSH是一个非常聪明的小工具,使我们可以立即在多个主机上发出相同的命令,并查看输出。
它是一种高性能和平行的远程shell实用程序。
它可以并行运行多个远程命令,并使用线程的"滑动窗口"(或者扇出)来节省启动主机上的资源,同时允许有一些连接。
在本文中,我们解释了如何安装PDSH工具并显示一些示例。

如何安装pdsh

安装PDSH真的很简单,请遵循吹水步骤

1)从Google代码下载最新版本的PDSH。

2)提取并解压缩PDSH文件

[shaha@oc8535558703 Downloads]$bzip2 -dc pdsh-2.26.tar.bz2 | tar xvf 
pdsh-2.26/
pdsh-2.26/config.h.in
pdsh-2.26/configure.ac
pdsh-2.26/configure
pdsh-2.26/bootstrap
pdsh-2.26/scripts/
pdsh-2.26/scripts/Makefile.am

3)现在使用以下命令安装PDSH

[shaha@oc8535558703 Downloads]$cd pdsh-2.26
[shaha@oc8535558703 pdsh-2.26]$./configure --with-ssh --without-rsh
checking metadata... yes
checking build system type... x86_64-redhat-linux-gnu
checking host system type... x86_64-redhat-linux-gnu
checking target system type... x86_64-redhat-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking for gcc... gcc
[shaha@oc8535558703 pdsh-2.26]$make
[shaha@oc8535558703 pdsh-2.26]$make install

4)完成后,请使用以下命令验证PDSH安装版本

[shaha@oc8535558703 pdsh-2.29]$pdsh -V
pdsh-2.26
rcmd modules: ssh,exec (default: ssh)
misc modules: (none)
[shaha@oc8535558703 pdsh-2.29]$

注意:将二进制文件放入/usr/local /,这对于测试目的很好。
对于生产工作,我会把它放入/选择或者类似的东西 - 只需确定它在路径中。

我们可能会注意到我在Configure命令中使用了--without-rsh选项。
默认情况下,PDSH使用RSH,这不是真正的安全性,因此我选择从配置中排除它。
要覆盖rsh并使ssh默认,我们只需将以下行添加到.bashrc文件:

[shaha@oc8535558703 ~]$cat .bashrc
# .bashrc
export PDSH_RCMD_TYPE=ssh
[shaha@oc8535558703 ~]$

请务必"来源".bashrc文件(即,source .bashrc)设置环境变量。
我们还可以注销并重新登录。
如果出于某种原因,我们尝试运行PDSH时会看到以下内容,

要求在多个节点上执行pdsh命令

a)ssh键

在这篇短暂的教程 文章中,我将看一下一些非常有用的工具,可以使生活成为Linux机器的Sysadmin更容易。
这可能是Hadoop群集,或者只是一个简单的一组简单的"正常"机器,我们要其中运行相同的命令和监视。

首先,我们将使用Ever-Agesome SSH键来管理群集中的安全性。
之后,我们将使用PDSH同时查看多台机器的相同命令。

简而言之,SSH键使我们能够以安全的方式进行密码验证。
使用SSH密钥涉及从一对的公钥,并将其添加到另一台计算机,以允许该货币对的私钥的所有者访问该机器。
我们在这里将要做的是生成一个唯一的密钥对,将被用作群集中的标识。
所以每个节点都有私钥的副本,以便能够对任何其他节点进行身份验证,这将保存公钥的副本(以及依次,相同的私钥)。

我们几种方法可以实现SSH键。
因为它是一个纯粹的沙箱群集,我可以使用与我的计算机上的群集生成相同的SSH密钥对,因此分布相同的公共/私钥对:

首先,我们需要使用ssh-keygen命令生成密钥

[shaha@oc8535558703 ]$ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/shaha/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/shaha/.ssh/id_rsa.
Your public key has been saved in /home/shaha/.ssh/id_rsa.pub.
The key fingerprint is:
42:eb:75:b6:67:f3:86:71:e2:30:af:62:24:15:27:1d [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
| .E. |
| o o |
| . + |
| . .. |
| o.S o |
| ..o.oo.o . |
| .o .=+= |
| o o+o. |
| . ... .. |
+-----------------+
[shaha@oc8535558703 ]$

这在.ssh文件夹中生成两个文件 - 该对的私有和公共(.pub)键:

[shaha@oc8535558703 ~]$cd .ssh/
[shaha@oc8535558703 .ssh]$ls -lrt
-rw-------. 1 shaha shaha 1675 Aug 4 01:03 id_rsa
-rw-r--r--. 1 shaha shaha 408 Aug 4 01:03 id_rsa.pub
[shaha@oc8535558703 .ssh]$

b)准备授权_keys文件

现在,我们将准备授权_keys文件,该文件是存储允许访问计算机的任何身份的公共SSH密钥的位置。
请注意,计算机上的每个用户都有自己的授权_keys文件,在~/.ssh /。
例如,root用户在/Root/.ssh/authorized_keys中包含该文件,并且该文件中列出的任何公钥都将能够作为root用户连接到服务器。
请注意美国[授权"的拼写 - 拼写[正确]作为"授权",你不会得到任何明显的错误,但SSH键登录也不工作。

分发SSH工件

现在我们将把这组SSH文件推出到每个节点上的目标用户的.ssh文件夹,在这种情况下是root用户。
从安全的角度来看,它可能更好地使用非root用户来使用非root用户登录,然后根据需要使用sudo,但我们将保持简单(和更不安全)的东西以在此开始。
所以我们文件夹中的文件是:

id_rsa - 密钥对id_rsa.pub的私钥 - 密钥对的公钥。

严格来说,这不需要向所有节点分发,但它是传统的和方便的,以持有私钥。

授权_keys - 这是每个节点上的SSHD守护程序的文件将查找,以验证传入的登录请求提供的私钥,因此需要保存允许作为此用户访问该计算机的任何人的公钥。

[shaha@oc8535558703 ~]$cat ~/.ssh/id_rsa.pub |ssh [email protected] 'cat >> .ssh/authorized_keys'
[email protected]'s password:
[shaha@oc8535558703 ~]$

此时,我们需要输入目标用户的密码,但很高兴!这是我们最后一次需要输入它,因为后续登录将使用我们现在正在配置的SSH键进行身份验证。

c)确认密码减少连接

如果在密码较少的连接期间,我们处于低于错误

[shaha@oc8535558703 .ssh]$ssh [email protected]
Agent admitted failure to sign using the key.
[email protected]'s password:

然后运行此命令

[shaha@oc8535558703 .ssh]$export SSH_AUTH_SOCK=0
[shaha@oc8535558703 .ssh]$ssh [email protected]
[shaha@oc8535558703 .ssh]$ssh [email protected]

PDSH命令示例

首先,我会尝试使用其IP地址获取节点的内核版本:

[shaha@oc8535558703 ~]$pdsh -w [email protected] uname -r
ec2-52-59-121-138: 4.4.11-23.53.amzn1.x86_64
[shaha@oc8535558703 ~]$

-w选项表示我指定将运行命令的节点。
在这种情况下,我指定了节点的IP地址(EC2-52-59-121-138)。
在节点列表之后,我添加了我想要运行的命令,在这种情况下是uname -R。
请注意,PDSH通过识别节点名称启动输出行。

1)单节点命令执行

要将命令组合在一起,我们将发送给每个主机或者单个主机,我们可以使用标准BASH运算符分号;

[shaha@oc8535558703 ~]$pdsh -w [email protected] uname -a;hostname ; who
ec2-52-28-150-229: Linux ip-172-31-16-42.eu-central-1.compute.internal 3.10.0-327.el7.x86_64 #1 SMP Thu Oct 29 17:29:29 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux
LinuxRedhatCluster
shaha tty1 2015-07-31 20:08 (:0)
shaha pts/0 2015-08-02 11:11 (:0.0)
shaha pts/1 2015-08-02 11:13 (:0.0)
shaha pts/2 2015-08-02 12:02 (:0.0)
shaha pts/3 2015-08-02 20:38 (:0.0)
shaha pts/4 2015-08-03 10:52 (:0.0)
shaha pts/5 2015-08-03 15:19 (:0.0)
shaha pts/6 2015-08-03 10:33 (:0.0)
shaha pts/7 2015-08-03 17:09 (:0.0)
shaha pts/8 2015-08-03 18:48 (:0.0)
shaha pts/9 2015-08-03 22:49 (:0.0)
[shaha@oc8535558703 ~]$

2)多节点命令执行

使用PDSH的一种非常常见的方式是将环境变量WCOLL设置为指向包含要在PDSH命令中使用的主机列表的文件。
例如,我创建了一个子目录PDSH,其中我创建了一个列出我想使用的主机的文件主机:

[shaha@oc8535558703 ~]$mkdir PDSH
[shaha@oc8535558703 ~]$cd PDSH
[shaha@oc8535558703 PDSH]$vi hosts

在hostfile中插入所有节点

[shaha@oc8535558703 PDSH]$more hosts
[email protected]
[email protected]
[shaha@oc8535558703 PDSH]$

我只是使用两个节点:ec2-52-58-254-227.eu-central-1.Compute.Amazonaws.com和EC2-52-59-121-138.eu-Central-1.Compute.Amazonaws。
COM。
第一个是我的测试系统(如群集头节点),第二个是我的测试计算节点。
我们可以在文件中放入文件中的主机,按照逗号分隔的命令行。
务必在文件末尾放置一个空行,因为PDSH将尝试连接到它。
我们可以将环境变量WCOLL放在.bashrc文件中:

export WCOLL=/home/shaha/PDSH/hosts

如前所述,我们可以源.bashrc文件,或者我们可以注销并登录。

3)指定Hosts命令执行

我不会列出所有其他方法来指定节点列表。
最简单的方法是指定命令行上的节点是使用-w选项:

[shaha@oc8535558703 ~]$pdsh -w [email protected],[email protected] uname -r
ec2-52-59-121-138: 4.4.11-23.53.amzn1.x86_64
ec2-52-58-254-227: 3.13.0-92-generic
[shaha@oc8535558703 ~]$

在这种情况下,我指定了用逗号分隔的节点名称。
我们还可以使用一系列主机如下:

[shaha@oc8535558703 PDSH]$pdsh -w ^hosts uptime
ubuntu@ec2-52-58-254-227: 10:00:52 up 2 days, 16:48, 0 users, load average: 0.05, 0.04, 0.05
ec2-user@ec2-52-59-121-138: 10:00:50 up 2 days, 16:51, 0 users, load average: 0.00, 0.01, 0.05
[shaha@oc8535558703 PDSH]$

4)更有用的pdsh命令

现在我可以转移到第二个装备中,尝试一些猛虎的PDSH技巧。
首先,我想在所有节点上运行更复杂的命令。
请注意,我将整个命令放在引号中。
这意味着整个命令在每个节点上运行,包括第一个(CAT/PROC/CPUInfo)和第二(Grep Bogomips,Model,CPU)部分。

[shaha@oc8535558703 PDSH]$pdsh 'cat /proc/cpuinfo' | egrep 'bogomips|model|cpu'
ubuntu@ec2-52-58-254-227: cpu family : 6
ubuntu@ec2-52-58-254-227: model : 63
ubuntu@ec2-52-58-254-227: model name : Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz
ubuntu@ec2-52-58-254-227: cpu MHz : 2400.070
ubuntu@ec2-52-58-254-227: cpu cores : 1
ubuntu@ec2-52-58-254-227: cpuid level : 13
ubuntu@ec2-52-58-254-227: bogomips : 4800.14
ec2-user@ec2-52-59-121-138: cpu family : 6
ec2-user@ec2-52-59-121-138: model : 62
ec2-user@ec2-52-59-121-138: model name : Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz
ec2-user@ec2-52-59-121-138: cpu MHz : 2500.036
ec2-user@ec2-52-59-121-138: cpu cores : 1
ec2-user@ec2-52-59-121-138: cpuid level : 13
ec2-user@ec2-52-59-121-138: bogomips : 5000.07
[shaha@oc8535558703 PDSH]$
[shaha@oc8535558703 PDSH]$pdsh vmstat 1 2
ec2-user@ec2-52-59-121-138: procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----
ec2-user@ec2-52-59-121-138: r b swpd free buff cache si so bi bo in cs us sy id wa st
ec2-user@ec2-52-59-121-138: 2 0 0 287424 122872 529200 0 0 1 5 10 20 0 0 100 0 0
ubuntu@ec2-52-58-254-227: procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----
ubuntu@ec2-52-58-254-227: r b swpd free buff cache si so bi bo in cs us sy id wa st
ubuntu@ec2-52-58-254-227: 1 0 0 262924 153712 505960 0 0 1 5 13 19 0 0 100 0 0
ec2-user@ec2-52-59-121-138: 0 0 0 287504 122872 529232 0 0 0 0 34 74 0 0 100 0 0
ubuntu@ec2-52-58-254-227: 0 0 0 262924 153712 505992 0 0 0 0 18 20 0 0 100 0 0
[shaha@oc8535558703 PDSH]$
[shaha@oc8535558703 ~]$pdsh -w ubuntu@ec2-52-59-121-138-node0[1-4] "date;sleep 5;date"
ec2-52-59-121-138-node01: Sat Nov 30 20:57:06 GMT 2015
ec2-52-59-121-138-node03: Sat Nov 30 20:57:06 GMT 2015
ec2-52-59-121-138-node04: Sat Nov 30 20:57:06 GMT 2015
ec2-52-59-121-138-node02: Sat Nov 30 20:57:06 GMT 2015
ec2-52-59-121-138-node01: Sat Nov 30 20:57:11 GMT 2015
ec2-52-59-121-138-node03: Sat Nov 30 20:57:11 GMT 2015
ec2-52-59-121-138-node04: Sat Nov 30 20:57:11 GMT 2015
ec2-52-59-121-138-node02: Sat Nov 30 20:57:11 GMT 2015

注意使用引号括到整个命令字符串。
没有他们,Bash翻译将采取;作为本地命令的分隔符,并尝试本地运行后续命令:

[shaha@oc8535558703 ~]$pdsh -w ubuntu@ec2-52-59-121-138-node0[1-4] date;sleep 5;date
ec2-52-59-121-138-node03: Sat Aug 30 20:57:53 GMT 2015
ec2-52-59-121-138-node04: Sat Aug 30 20:57:53 GMT 2015
ec2-52-59-121-138-node02: Sat Aug 30 20:57:53 GMT 2015
ec2-52-59-121-138-node01: Sat Aug 30 20:57:53 GMT 2015
Sat 30 Aug 2015 20:58:00 GMT

5)管道和文件重定向

类似于上面的组合命令,我们可以管制命令的输出,并且需要使用引号括到整个命令字符串。

[shaha@oc8535558703 ~]$pdsh -w root@ec2-52-59-121-138-node[01-4] "chkconfig|grep collectl"
ec2-52-59-121-138-node03: collectl 0:off 1:off 2:on 3:on 4:on 5:on 6:off
ec2-52-59-121-138-node01: collectl 0:off 1:off 2:on 3:on 4:on 5:on 6:off
ec2-52-59-121-138-node04: collectl 0:off 1:off 2:on 3:on 4:on 5:on 6:off
ec2-52-59-121-138-node02: collectl 0:off 1:off 2:on 3:on 4:on 5:on 6:off