たくさんのマシンに一気にコマンドを投入する

会社で数十台のクラスタを組んで、EC2もどきを運用しているのですが、基本的にボランティアでやっているので運用はできるだけ省力化したい。
Puppet使ってセットアップやメンテの大部分を自動化したりはしているのですが、トラブルの調査などがどうしてもめんどい。
全ノードに一気にコマンド発行して結果を見たいとか、よくありますよね。
この手の、一気に複数のマシンにコマンドを発行する仕組みはいくつかあります。


あたりを試したことはあったのですが、Cluster SSH は、ある程度のノード数以上になると実用的じゃないし、dsh は、ノードから返ってくる結果とノードの対応が取りづらい。
そこで、 pdsh を試してみました。
Ubuntuリポジトリにも入ってますのでインストールは簡単。

# sudo apt-get install pdsh

リモートコマンドの発行に ssh を使うため、以下のファイルを作ります。

  • /etc/pdsh/rcmd_default

ssh

コマンドを発行するメンテ用マシンとかでssh公開鍵を生成して、各ノードへのsshを証明書ベースでできるようにしておくのは pdsh 以外のツールと同じ。
で、コマンドを実行すると

# pdsh date
node022: Mon Sep 3 12:29:15 JST 2012
node014: Mon Sep 3 12:29:15 JST 2012
node021: Mon Sep 3 12:29:15 JST 2012

という感じで、各ノードに一気にコマンドを発行して、リターンをノードと対応づけられる形式で表示してくれます。
発行するノードのリストは、

node014
node021
node022

みたいな感じでテキストファイルを作っておき、例えば ~/node.list とかとして保存しておきます。
で、コマンドを発行する時に、

export WCOLL=~/node.list

のように WCOLL 環境変数として指定しておけば、ノードを pdsh コマンドにいちいち指定しなくても一気に発行できます。
自分が運用しているクラスタは、そう頻繁にノードの出入りがないので、リストを作って上記環境変数を設定して使っています。
もちろん、

# pdsh -x node014,node21 date

というように、コマンドに直接指定することもできます。


実際に運用を担当している方には分かると思いますが、こういうのあるとないとでは、かなり運用作業にかかる時間、コストが変わってきます。
何より、運用担当者のストレスが下がるのがでかい。