複数のホストに対してコマンドを同時に実行できるツールとして、以前にpsshを試してみました。
今度は、Parallel Distributed Shell (pdsh) を試したところ、使い勝手が良かったのでメモしておきます。

名前のとおり、並列で多数のホストにコマンドを同時実行できます。
通信にはsshの他、rsh等も使えます。
今回はソースからmakeしてインストールしました。

configureのオプションには以下を使用してみました。
rshは使わないので無効にして、sshを使うようにし、-gでホストをグループ指定できるようにし、GNU readline libraryを使うように。

--without-rsh --with-ssh --with-dshgroups --with-readline

今回は使いませんでしたが、--with-machines=/etc/machines も追加してもいいかも。
-aで /etc/machines に記述されたホストを指定できるようになります。

インストール後に -V オプションでの実行結果は以下。

console01:~ # pdsh -V
pdsh-2.22 (+readline)
rcmd modules: ssh,exec (default: ssh)
misc modules: dshgroup
console01:~ #

[追記]
通常だと、src.rpmのパッケージをダウンロードして、rpmbuild --rebuild等してできたrpmパッケージをインストールした方が楽ですね。
[追記ここまで]

-g オプションで使えるグループ指定が便利です。
~/.dsh/group/ や /etc/dsh/group/ 以下にホストをグループに分けて、わかりやすいファイル名で保存。
例えば、計算ノードとして /etc/dsh/group/compute といったファイルを作成し、以下のように使用できる。

console01:~ # cat /etc/dsh/group/compute 
node01
node02
node03
node04
console01:~ # 
console01:~ # pdsh -g compute uptime | sort
node01:   2:26pm  up 132 days 21:48,  0 users,  load average: 0.00, 0.02, 0.00
node02:   2:26pm  up 132 days 20:39,  0 users,  load average: 0.10, 0.08, 0.01
node03:   2:26pm  up 132 days 21:47,  0 users,  load average: 0.08, 0.15, 0.16
node04:   2:26pm  up 132 days 20:11,  0 users,  load average: 0.00, 0.02, 0.00
console01:~ # 

対象ホストの指定の方法は他にもいろいろあり、柔軟に指定できます。
詳しくはmanページを参照してください。

また、pdshと同時にインストールされる dshbak を使うと、pdsh の出力を整形できます。

例えば、fsグループの fs01〜fs10 のOSがSLES10SP3で、fs11〜fs15がSLES11SP1だとすると、以下のように結果を見やすくまとめてくれます。

console01:~ # pdsh -g fs cat /etc/SuSE-release | dshbak -c
----------------
fs[01-10]
----------------
SUSE Linux Enterprise Server 10 (x86_64)
VERSION = 10
PATCHLEVEL = 3
----------------
fs[11-15]
----------------
SUSE Linux Enterprise Server 11 (x86_64)
VERSION = 11
PATCHLEVEL = 1
console01:~ # 

[2010年9/15追記]
manページに書いてある事ですが、デフォルトの同時実行数は32になっています。
実行対象がそれより多い場合、32ノードの実行が終わった後に、次が実行されます。
例えば、100ノード同時に実行したい場合は、オプション -f 100 を付ければOKです。
逆に、1台ずつ順番に実行したい場合は、-f 1 で可能です。場合によっては便利です。
また、実行コマンドの引数で %h は対象のホスト名に変換されます。使う機会があるかも。
[追記ここまで]

あと、pdshを全ノードに入れると、pdcpとrpdcpが使えるようになります。
pdcpで全ノードにコピーでき、rpdcpで全ノードから指定ディレクトリにホスト名のサフィックス付きでコピーできます。

console01:~ # ls -l /tmp/foo 
-rw-r--r-- 1 root root 0 Sep 12 15:07 /tmp/foo
console01:~ # 
console01:~ # pdcp -g compute /tmp/foo /var/tmp
console01:~ # 
console01:~ # pdsh -g compute ls -l /var/tmp/foo
node01: -rw-r--r-- 1 root root 0 Sep 12 15:11 /var/tmp/foo
node02: -rw-r--r-- 1 root root 0 Sep 12 15:11 /var/tmp/foo
node03: -rw-r--r-- 1 root root 0 Sep 12 15:11 /var/tmp/foo
node04: -rw-r--r-- 1 root root 0 Sep 12 15:11 /var/tmp/foo
console01:~ # 
console01:~ # mkdir /tmp/work
console01:~ # rpdcp -g compute /var/tmp/foo /tmp/work/
console01:~ # 
console01:~ # ls -l /tmp/work/
total 0
-rw-r--r-- 1 root root 0 Sep 12 15:12 foo.node01
-rw-r--r-- 1 root root 0 Sep 12 15:12 foo.node02
-rw-r--r-- 1 root root 0 Sep 12 15:12 foo.node03
-rw-r--r-- 1 root root 0 Sep 12 15:12 foo.node04
console01:~ # 

Parallel Distributed Shell かなり便利ですね。

このブログの関連記事