Parallel sshで複数のホストへ同時にコマンドを実行する
pssh
pssh(Parallel ssh)とは、複数のホストに対して同じ処理が実行できる並行処理型のSSHツールです。psshには平行処理形で複数のホストにscp、rsyncが実行出来るpscp、prsync、複数のホストから一斉にファイルを収集するpslurpが含まれています。
使い方がシンプルなので複数のホストに同じ処理を実行したい場合に便利です。
導入環境はCentOS5.5です。
psshの導入
psshの導入にsetuptoolsが必要なのでyumで導入
sudo yum -y install python-setuptools |
最新版のpsshを導入。2010/08/26現在の最新バージョンは2.1.1です。
mkdir ~/tmp cd ~/tmp wget http://parallel-ssh.googlecode.com/files/pssh-2.1.1.tar.gz tar zxvf pssh-2.1.1.tar.gz cd pssh-2.1.1 sudo python setup.py install |
pssh(pscp、prsync、pslurp)を利用するには
- psshを実行するサーバから各ホストにssh鍵が通してある
- psshで指定するユーザ(-lオプションで指定するユーザ)が各ホストに存在し、ssh接続が可能である。
が必要になります。
pssh 複数のホストで一斉に同じ処理をする
簡単な利用方法は下記のような形で
pssh -h {リストファイル名} -l {コマンドを実行するユーザ名} -i {コマンド} |
psshの主要なオプションは下記のとおりです。
オプション -h ホストを記載したリストファイルを指定 -l リモートでコマンドを実行するユーザ -p sshのポート番号を指定(指定しない場合はデフォルトの22番を利用) --timeout コマンドのタイムアウト時間を指定(デフォルトは60秒) |
-h で指定するリストファイルは下記のような形になっています。ローカル環境なのでglidenote.lanを指定。
[akira@manage][0] $ cat db_server_list.txt m-db001.glidenote.lan s-db001.glidenote.lan s-db002.glidenote.lan s-db003.glidenote.lan s-db004.glidenote.lan |
psshを利用してuptimeコマンドを一斉に実行した際の結果
[akira@manage][0] $ sudo pssh -h db_server_list.txt -l root -i "uptime" [1] 18:49:04 [SUCCESS] m-db001.glidenote.lan 18:49:04 up 30 days, 6:47, 1 user, load average: 0.91, 0.67, 0.56 [2] 18:49:04 [SUCCESS] s-db001.glidenote.lan 18:49:04 up 26 days, 7:00, 2 users, load average: 0.36, 0.27, 0.24 [3] 18:49:04 [SUCCESS] s-db004.glidenote.lan 18:49:04 up 26 days, 6:51, 2 users, load average: 0.00, 0.02, 0.00 [4] 18:49:04 [SUCCESS] s-db003.glidenote.lan 18:49:04 up 26 days, 6:54, 1 user, load average: 0.26, 0.25, 0.20 [5] 18:49:04 [SUCCESS] s-db002.glidenote.lan 18:49:04 up 26 days, 6:57, 0 users, load average: 0.20, 0.26, 0.26 |
s-db005.glidenote.lan,s-db006.glidenote.lanという存在しないホストをリストに
登録すると下記のように[FAILURE]と返ってきます。
[akira@manage][0] $ sudo pssh -h db_server_list.txt -l root -i "uptime" [~] [1] 18:50:31 [FAILURE] s-db005.glidenote.lan Exited with error code 255 [2] 18:50:31 [FAILURE] s-db006.glidenote.lan Exited with error code 255 [3] 18:50:31 [SUCCESS] m-db001.glidenote.lan 18:50:31 up 30 days, 6:48, 1 user, load average: 0.60, 0.61, 0.54 [4] 18:50:31 [SUCCESS] s-db001.glidenote.lan 18:50:31 up 26 days, 7:02, 2 users, load average: 0.66, 0.36, 0.27 [5] 18:50:31 [SUCCESS] s-db002.glidenote.lan 18:50:31 up 26 days, 6:58, 0 users, load average: 0.15, 0.23, 0.25 [6] 18:50:31 [SUCCESS] s-db003.glidenote.lan 18:50:31 up 26 days, 6:55, 1 user, load average: 0.26, 0.26, 0.21 [7] 18:50:31 [SUCCESS] s-db004.glidenote.lan 18:50:31 up 26 days, 6:52, 2 users, load average: 0.00, 0.02, 0.00 |
pscp 複数のホストのファイルを転送
scpコマンドを複数のホストの実行する形になります。puppetやデプロイツールを利用している場合は、あまり利用することはないかもしれません。利用方法は
pscp -h {リストファイル名} -l {コマンド実行ユーザ名} \ {ローカルのファイルパス} {リモートのファイルパス} |
実際のコマンドは下記のような形です。
sudo pscp -h db_server_list.txt -l glidenote \ /home/glidenote/hogehoge.txt /home/glidenote/hogehoge.txt |
ディレクトリごとscpする場合は再帰的に処理するオプション –recursive を付加
sudo pscp -h db_server_list.txt --recursive -l glidenote \ /home/glidenote/hoge_dir /home/glidenote/ |
prsync 複数のホストとファイルを同期する
これもpscpと同様にpuppetやデプロイツールを利用している場合にはあまり利用しないかと思います。使い方は
prsync -h {リストファイル名} -l {コマンド実行ユーザ名} \ {ローカルパス} {リモートパス} |
実際のコマンドは下記のようになります。
sudo prsync -h db_server_list.txt --recursive -l glidenote \ /hoge/akira/work /home/glidenote/remote_work |
再帰的に処理する場合は –recursiveを付加
sudo prsync -h db_server_list.txt -l root -a --recursive \ /home/akira/pscp_dir /root/tmp/ |
pslurp 複数のホストから一括でファイルを取得する
pslurpは複数のホストから一括でファイルを取得できるので、ログや設定ファイルを一斉に収集したい場合などに重宝します。
pslurp -h {リストファイル名} -l {コマンド実行ユーザ名} \ -L {ファイルを保存するローカルパス} -r {リモートパス} {ファイルを保存するディレクトリ名} |
ホストごとにディレクトリが作成され、一番最後に指定する引数でディレクトリ名が生成されるので、ファイルも見やすく、トラブル時などは非常に便利です。
sudo pslurp -h db_server_list.txt -l root \ -L /home/akira/result -r /var/log/messages messages |
実際ファイルを収集した際のディレクトリ構成
[akira@manage][0] $ ls -al /home/akira/result total 28 drwxr-xr-x 7 root 4096 Aug 24 18:07 . drwx------ 13 akira 4096 Aug 24 18:09 .. drwxr-xr-x 2 root 4096 Aug 24 18:07 m-db001.glidenote.lan drwxr-xr-x 2 root 4096 Aug 24 18:07 s-db001.glidenote.lan drwxr-xr-x 2 root 4096 Aug 24 18:07 s-db002.glidenote.lan drwxr-xr-x 2 root 4096 Aug 24 18:07 s-db003.glidenote.lan drwxr-xr-x 2 root 4096 Aug 24 18:07 s-db004.glidenote.lan |
ホストごとにディレクトリが生成されて、設定が確認しやすいです。
[akira@manage][0] $ ls -R /home/akira/result /home/akira/result: m-db001.glidenote.lan s-db001.glidenote.lan s-db002.glidenote.lan s-db003.glidenote.lan s-db004.glidenote.lan /home/akira/result/m-db001.glidenote.lan: messages /home/akira/result/s-db001.glidenote.lan: messages /home/akira/result/s-db002.glidenote.lan: messages /home/akira/result/s-db003.glidenote.lan: messages /home/akira/result/s-db004.glidenote.lan: messages |
pnuke 複数のホストで同時にプロセスをkillする
条件に一致したプロセスを一斉にpkill -9するpnukeというコマンドもpsshに含まれていますが、
psshで代用が出来るとの、これまでの経験でそういったことが必要だったことがないので利用していません。
ドキュメントが少ないの(pythonなので何をしているかは読めば分かりますが)と、エラー時に簡単なログしか吐かなかったりするので原因が掴みにくい部分がありますが、使い方は非常にシンプルなので、
- 一斉にサーバのステータスを知りたい時
- トラブル時に全台に同じコマンドを実行したい場合
- 全台からログを収集したい場合
など非常に便利です。
非常に便利なコマンドですが、一斉に全ホストに処理が実行されるので、必ずテスト用サーバを数台だけ記載したリストファイルを用意し、問題がなければ全台に適用などを行った方がいいです。
参考サイト
Leverage OSS:1つのシェルから複数のSSHセッションを同時に実行するツール3種類を試す (1/4) – ITmedia エンタープライズ
しげふみメモ : Parallel ssh (pssh)で複数ホストでコマンド同時実行

