pssh(pararell-ssh)で複数サーバの同時操作

pssh(pararell-ssh)で複数サーバの同時操作 はてなブックマーク - pssh(pararell-ssh)で複数サーバの同時操作


PSSH ( Pararell-ssh ) は、Linux 上で複数のサーバに対して同時に SSH ログインし、コマンドを実行するだけのシンプルなツール。様々なデプロイ用のツールがある中で、古くから、純粋にコマンドを叩くことに特化しているツールが pssh 。シンプルながら、必要十分な機能を備えています。Verion 2.x 系の情報はまとまっていないようなので、自分のメモがてら、簡単なセットアップ方法と、簡易チュートリアルを掲載しました。

■ PSSH とは何ぞ?

PSSH は Parerll-ssh (並列 ssh) の名前の通り、複数のサーバに対して同時に ssh を走らせることが出来るツールです。例えば、手許に複数のサーバがあるとして、同時に uptime コマンドを走らせたい時や、十数台の httpd.conf を一斉に書き換えて apache 再起動することも、手軽です。

pssh で3台のサーバで同時に uptime を実行した所

PSSH ( pararell-ssh ) は Python 2.4 以上の環境で動作します。Python が動作するのであれば、特に他に必要なライブラリ等はありません。パッケージには pssh のほか、pscp ( Pararell scp ) や、 prsync ( Pararell rsync = ファイル・ディレクトリ同期)、pnuke ( Pararell nuke = kill コマンド実行)、pslurp ( Pararell slurp = ファイル収集)が含まれます。

オリジナルの PSSH は、Brent N. Chun氏によって開発されていました( Version 1.x 系、2003年から 2008 年にかけて。詳しくは氏のサイトを参照ください)。その後、プロジェクトは Google Code 上に移行し ( http://code.google.com/p/parallel-ssh/ ) 、今日では Version 2.x 系の開発が行われています。

Version 2.x 系は、1.x 系になかった実用的な機能の拡張が図られています。例えば、

  • SSH の鍵認証設定が必須ではなくなった(-A オプションでパスワードを入力可能に)
  • 複数ホストの定義がコマンドラインで出来るようになった ( -H オプション )
  • Ctrl + C で強制中断できるようになった

このように「便利だけどイマイチ」だった所が改善されているのが、大きな特長です。

■PSSHの動作環境

pssh を実行する環境には、 Python 2.4 以上が組み込まれている必要があります。pssh の接続先には、何もセットアップは必要ありません。SSH を使ったログイン設定は個々に必要です。

■セットアップ

ソースコードから構築します。バイナリパッケージは配付されていませんが、手順はとてもシンプルです。以下、手順をまとめました。

$ wget http://parallel-ssh.googlecode.com/files/pssh-2.1.1.tar.gz
$ tar xvfz pssh-2.1.1.tar.gz
$ cd pssh-2.1.1
$ wget 'http://peak.telecommunity.com/dist/ez_setup.py'
# python ez_setup.py
Setuptools version 0.6c11 or greater has been installed.
(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)
# python setup.py install
(略)
Installed /usr/lib/python2.4/site-packages/pssh-2.1.1-py2.4.egg
Processing dependencies for pssh==2.1.1
Finished processing dependencies for pssh==2.1.1

これだけでセットアップ完了です。

■pssh を使ってみる(チュートリアル)

手許に 192.168.10.1 と 192.168.10.2 というホストがあるとします。両方のサーバには SSH 鍵ペアを作成しておき、パスフレーズ無しでログインできるように設定しておきます。

まずは、192.168.10.1 に対して uptime コマンドを実行します。ここで用いるオプションは次の通りです。

  • -H … オプションでホスト名を指定
  • -i  … コマンド実行結果を(インラインで)表示。これが無いと結果は表示されません

では、実際に実行してみます。

$ pssh -H 192.168.10.1 -i uptime
[1] 23:40:51 [SUCCESS] 192.168.10.1
 23:40:51 up 1083 days, 12:28,  1 user,  load average: 0.78, 0.46, 0.41

このように表示されましたでしょうか。[SUCCESS]と表示されていれば成功です。もし、「[FAILURE] Exited with error code 255」と表示されたら、SSH が接続可能かどうか確認してください。よくあるのが、次のエラーメッセージが表示される場合です。「Stderr: Permission denied.  Please create SSH keys or use the -A option to provide a password.」これが表示される場合は、純粋に SSH の認証に失敗している場合がほとんどです。( Version 2.x であれば、-A オプションを用いることで、鍵認証を行わず、通常のパスワード認証を行う事が出来ます。ただし、ログイン先の全パスワードが共通でなくてはいけません)

なお、ここではユーザ名を省略しましたが「ユーザ名@ホスト名」とすることで、ログインアカウントを指定することも出来ます。指定しない場合は、「現在操作している」ログインで接続を試みます(ただし、 -l オプションを用いることで、pssh がログインする全サーバのログインアカウントを明示することが出来ます)。

さて、これまでであれば、通常の SSH と何ら変わりません。それでは次に「192.168.10.2」というホストに対しても uptime の実行を試みます。複数ホストの指定は「 -H 192.168.10.2 」を新たにコマンドに追記するだけです。

$ pssh -H 192.168.10.1 -H 192.168.10.2 -i uptime
[1] 23:47:00 [SUCCESS] 192.168.10.1
 23:47:00 up 1083 days, 12:34,  1 user,  load average: 1.05, 0.72, 0.51
[2] 23:47:00 [SUCCESS] 192.168.10.2
 23:47:00 up 684 days,  3:58,  1 user,  load average: 0.85, 0.72, 0.67

さて、毎回 -H を指定する方法もありますが、予めログイン先が決まっている場合はホスト定義ファイルを使えば楽です。

テキストエディタで hosts.txt などを作成します。ファイルの中は、ホスト名を記述します。

192.168.10.1
192.168.10.2

今度は -H オプションでホストを指定した代わりに、-h オプションで hosts.txt に記述したホストに対して uptime を試みましょう。

$ pssh -h ./hosts.txt -i uptime
[1] 23:49:36 [SUCCESS] 192.168.10.1
 23:49:36 up 1083 days, 12:37,  1 user,  load average: 0.37, 0.51, 0.46
[2] 23:49:36 [SUCCESS] 192.168.10.2
 23:49:36 up 684 days,  4:01,  1 user,  load average: 0.85, 0.79, 0.70

はい、これで2台のサーバで同時に実行することができました。

以上で、pssh のチュートリアルは終わりです。pssh –help を実行すると、更に詳細なオプションが表示されますので色々試してみると幸せになれるかもしれません。古いドキュメントですが Verison 1.x の howto(英語) が参考になると思います。

とりあえず ssh を沢山走らせるだけなら pssh は十分じゃないかと思います。pssh の他にも、様々な言語で書かれた様々なツールがあります。pssh を切っ掛けに、いろいろ試してみては如何でしょうか。