Parallel sshで複数のホストへ同時にコマンドを実行する | Glide Note – グライドノート

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 ~/tmpcd ~/tmpwget http://parallel-ssh.googlecode.com/files/pssh-2.1.1.tar.gztar zxvf pssh-2.1.1.tar.gzcd pssh-2.1.1sudo 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.txtm-db001.glidenote.lans-db001.glidenote.lans-db002.glidenote.lans-db003.glidenote.lans-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/resulttotal 28drwxr-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.landrwxr-xr-x  2 root  4096 Aug 24 18:07 s-db001.glidenote.landrwxr-xr-x  2 root  4096 Aug 24 18:07 s-db002.glidenote.landrwxr-xr-x  2 root  4096 Aug 24 18:07 s-db003.glidenote.landrwxr-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なので何をしているかは読めば分かりますが)と、エラー時に簡単なログしか吐かなかったりするので原因が掴みにくい部分がありますが、使い方は非常にシンプルなので、

  • 一斉にサーバのステータスを知りたい時
  • トラブル時に全台に同じコマンドを実行したい場合
  • 全台からログを収集したい場合

など非常に便利です。
非常に便利なコマンドですが、一斉に全ホストに処理が実行されるので、必ずテスト用サーバを数台だけ記載したリストファイルを用意し、問題がなければ全台に適用などを行った方がいいです。

コメントを残す