pdshを使用して複数台のサーバでコマンドを同時発行する



●インストール

 参考URL:pdshを使って複数台のサーバに対して同じコマンドを発行する方法

 参考URL:分散シェルまとめ

 複数台のサーバに対して同時にコマンドを発行し一度に作業を行いたい場合があります。便利なツールとして同時にSSH接続するpdshがあります。
 使用上のポイントとしては必ずワンライナーで書いて対話式のコマンドでは使用しないことです。使用先のサーバにもpdshをインストールしておくとpdcpやrpdcpというコピーコマンドも使用できるようになってますます便利です。ということらしい。
 ただし、前提条件として使用したいサーバ全てにSSH公開鍵の設定をしておく必要があります。
 インストールは下記のようにします。
# yum --enablerepo=epel -y install pdsh
 pdshを使用するだけならpdshコマンドを実行するサーバにインストールします。

●使用方法

 server-a、server-b(もちろんIPアドレスの記載でもOK)に接続するには下記のようにします。
※整形無し
% pdsh -w server-a,server-b 'date;hostname;id'
または
% pdsh -w server-[a,b] 'date;hostname;id'
server-a: 2017年  3月  9日 木曜日 13:23:29 JST
server-a: server-a.bigbang.mydns.jp
server-a: uid=1000(hoge) gid=1000(hoge) groups=1000(hoge)
server-b: 2017年  3月  9日 木曜日 13:23:30 JST
server-b: server-b.bigbang.mydns.jp
server-b: uid=1000(hoge) gid=1000(hoge) groups=1000(hoge)
※整形有り
$ pdsh -w server-a,server-b 'date;hostname;id'|dshbak
----------------
server-a
----------------
2017年  3月  9日 木曜日 14:30:10 JST
server-a.bigbang.mydns.jp
uid=1000(hoge) gid=1000(hoge) groups=1000(hoge)
----------------
server-b
----------------
2017年  3月  9日 木曜日 14:30:11 JST
server-b.bigbang.mydns.jp
uid=1000(hoge) gid=1000(hoge) groups=1000(hoge)
 目的毎に事前にグループを作成しておくことでグループ指定することが可能です。

●グルーピング

 毎回複数のサーバを指定するのは非常に煩わしいものです。pdsh-mod-dshgroupを合わせてインストールしておくと複数のホストをグループで管理できるようになります。
# yum --enablerepo=epel -y install pdsh-mod-dshgroup
 グルーピングファイルは、$HOME/.dsh/group/に、グループ名(任意)をつけたファイルに複数のサーバを1行1サーバで指定する。
$ cat ~/.dsh/group.txt
server-a
server-b
server-c
$ pdsh -g group.txt 'date;hostname;id'


●pdcp、rpdcp

 pdcpはファイルを同時に転送する場合に使用します。使用方法はscpと同じです。ただし、事前に相手先サーバにもpdshをインストールしておく必要があります。
$ touch test.txt
$ pdcp -w server-a,server-b test.txt ~/
 これで全サーバにファイルが転送されます。念のため、確認。
$ pdsh -w server-a,server-b 'ls -l ~/test.txt'
server-a: -rw-rw-r-- 1 hoge hoge 0  3月  9 14:04 /home/hoge/test.txt
server-b: -rw-rw-r-- 1 hoge hoge 0  3月  9 14:04 /home/hoge/test.txt
 逆に全サーバからファイルを手元にコピーする場合はrpdcpを利用します。rpdcpコマンドを実行すると、suffixにhost名が付与された形で保存されます。
$ rpdcp -w server-a,server-b ~/test.txt ./
$ ls -l test.txt*
-rw-rw-r-- 1 hoge hoge 0  3月  9 14:04 test.txt
-rw-rw-r-- 1 hoge hoge 0  3月  9 14:14 test.txt.server-a
-rw-rw-r-- 1 hoge hoge 0  3月  9 14:14 test.txt.server-b