複数のホストに対してコマンドを同時に実行できるツールとして、以前にCluster SSHを試してみました。
今度は Parallel ssh (pssh) を試してみました。
参考: 1つのシェルから複数のSSHセッションを同時に実行するツール3種類を試す - SourceForge.JP Magazine

bashでforループを回すのはちょっとした事だとよく使いますが、psshだと同時にできるのが利点のひとつ。
とりあえず、メモ程度ですがopenSUSE 10.3で試してみました。

Parallelということなので、ほぼ同時に実行開始されます。
そして、結果が返ってくるのはばらばらです。結果を標準出力に表示する場合は見辛いかもしれません。

-h オプションで対象ホストを記述したホストファイルを指定。
console01:~ # cat hosts-admin-all
admin01
admin02
admin03
admin04
admin05
admin06
console01:~ # 
-i オプションでホスト毎に表示。
console01:~ # pssh -h hosts-admin-all -i uptime
[1] 16:24:22 [SUCCESS] admin01 22
  4:24pm  up 47 days  3:04,  1 user,  load average: 0.02, 0.01, 0.00
[2] 16:24:22 [SUCCESS] admin06 22
  4:24pm  up 47 days  3:29,  1 user,  load average: 0.00, 0.00, 0.00
[3] 16:24:22 [SUCCESS] admin04 22
  4:24pm  up 47 days  3:21,  2 users,  load average: 0.10, 0.06, 0.01
[4] 16:24:22 [SUCCESS] admin05 22
  4:24pm  up 47 days  3:04,  1 user,  load average: 0.00, 0.02, 0.00
[5] 16:24:22 [SUCCESS] admin02 22
  4:24pm  up 47 days  3:03,  2 users,  load average: 0.01, 0.04, 0.00
[6] 16:24:22 [SUCCESS] admin03 22
  4:24pm  up 47 days  3:04,  1 user,  load average: 0.00, 0.03, 0.00
console01:~ # 
環境変数でホストファイル指定などを省略できる。
console01:~ # export PSSH_HOSTS=~/hosts-admin-all
コマンドの結果が1行だけであれば、-P オプションでもわかりやすい。
console01:~ # pssh -P uptime | grep -v SUCCESS | sort
admin01:   4:24pm  up 47 days  3:04,  1 user,  load average: 0.01, 0.01, 0.00
admin02:   4:24pm  up 47 days  3:04,  2 users,  load average: 0.01, 0.03, 0.00
admin03:   4:24pm  up 47 days  3:04,  1 user,  load average: 0.07, 0.04, 0.00
admin04:   4:24pm  up 47 days  3:21,  2 users,  load average: 0.06, 0.06, 0.01
admin05:   4:24pm  up 47 days  3:05,  1 user,  load average: 0.00, 0.02, 0.00
admin06:   4:24pm  up 47 days  3:30,  1 user,  load average: 0.00, 0.00, 0.00
console01:~ # 
-o オプションで結果の出力ディレクトリを指定し、more等で確認。
console01:~ # pssh -o /root/pssh-log/ uptime 
[1] 16:30:10 [SUCCESS] admin01 22
[2] 16:30:10 [SUCCESS] admin06 22
[3] 16:30:10 [SUCCESS] admin04 22
[4] 16:30:10 [SUCCESS] admin03 22
[5] 16:30:10 [SUCCESS] admin05 22
[6] 16:30:10 [SUCCESS] admin02 22
console01:~ # 
console01:~ # more /root/pssh-log/admin0?
::::::::::::::
/root/pssh-log/admin01
::::::::::::::
  4:30pm  up 47 days  3:09,  1 user,  load average: 0.08, 0.04, 0.00
::::::::::::::
/root/pssh-log/admin02
::::::::::::::
  4:30pm  up 47 days  3:09,  2 users,  load average: 0.07, 0.02, 0.00
::::::::::::::
/root/pssh-log/admin03
::::::::::::::
  4:30pm  up 47 days  3:09,  1 user,  load average: 0.01, 0.05, 0.01
::::::::::::::
/root/pssh-log/admin04
::::::::::::::
  4:30pm  up 47 days  3:26,  2 users,  load average: 0.02, 0.05, 0.01
::::::::::::::
/root/pssh-log/admin05
::::::::::::::
  4:30pm  up 47 days  3:10,  1 user,  load average: 0.00, 0.02, 0.00
::::::::::::::
/root/pssh-log/admin06
::::::::::::::
  4:30pm  up 47 days  3:35,  1 user,  load average: 0.03, 0.04, 0.01
console01:~ # 
結果をgrepやawk等で整形してホスト毎に確認しやすいので良いかも。

scpの並行処理版の pscp コマンドもあります。

console01:/root/foo を 対象ホストの /tmp/foo にコピー。
console01:~ # touch /root/foo
console01:~ # 
console01:~ # pscp /root/foo /tmp/foo
[1] 16:39:59 [SUCCESS] admin04 22
[2] 16:39:59 [SUCCESS] admin03 22
[3] 16:39:59 [SUCCESS] admin01 22
[4] 16:39:59 [SUCCESS] admin02 22
[5] 16:39:59 [SUCCESS] admin06 22
[6] 16:39:59 [SUCCESS] admin05 22
console01:~ # 
console01:~ # pssh -i ls -l /tmp/foo
[1] 16:40:24 [SUCCESS] admin01 22
-rw-r--r-- 1 root root 0 Jun 17 16:39 /tmp/foo
[2] 16:40:25 [SUCCESS] admin05 22
-rw-r--r-- 1 root root 0 Jun 17 16:39 /tmp/foo
[3] 16:40:25 [SUCCESS] admin06 22
-rw-r--r-- 1 root root 0 Jun 17 16:39 /tmp/foo
[4] 16:40:25 [SUCCESS] admin04 22
-rw-r--r-- 1 root root 0 Jun 17 16:39 /tmp/foo
[5] 16:40:25 [SUCCESS] admin03 22
-rw-r--r-- 1 root root 0 Jun 17 16:39 /tmp/foo
[6] 16:40:25 [SUCCESS] admin02 22
-rw-r--r-- 1 root root 0 Jun 17 16:39 /tmp/foo
console01:~ # 

対象ホストの台数が多くなってくるとforループより便利かもしれないですね。
しばらく使ってみます。

このブログの関連記事