[GNU] parallel+ssh で複数のリモートホストに複数のコマンドを実行させる

仮想化大好きな皆さん( ノ゚Д゚)こんばんわ。…なんだこの顔文字。2ch辞書入れてる所為か、恐いな(;´Д`)
さて、家やAWSにサーバをお持ちの仮想化大好きの皆様は、もう100も 200もサーバを管理されていることと認知しています。したがって、マルチサイトを管理するための専用のツールなどを入れて、効率的に管理しているだろうと予想します。流石です。それにつけても、仮想化初心者の私の自宅サーバでは、マシンスペックも非力ですし、そんなにたくさんを管理することなど不可能です。ましてやお金がないのに、専用の管理ツールなんて…。

そのため、ごにょごにょして、ssh で rootでは non password で、DSAの鍵認証をさせて、あるサーバから、全てのサーバへログインできるようにして、複数のサイトへコマンドを実行できるように、なんてことをしています。例えばこんなワンライナーで。

1
$ for server in host01 host02 host03 ; do ssh $server "command01;command02" ; done

ただ、これではシングルタスクで順次実行ですし、”sudo” 使えないので、sudo したければ shell を組まねばなりません。

そこで登場したるは”GNU Parallel“コマンドです。複数ジョブを一気に実行できますし、コマンド化されているので sudoかけることもできます。先ほどの例を展開すると。

1
$ sudo parallel -j 3 ssh {} "command01;command02" ::: host01 host02 host03

簡単ですね。ホスト名の一覧の入ったファイルを指定して

1
$ cat hostlist | sudo parallel -j 3 ssh {} "command01;command02"

こんなことをすることもできます。便利ですねヽ(´ー`)ノ I)なお、”-j 3″はジョブを3つ並行起動する。です。大きくすれば同時実行数が増えます。CPU使用率での表現も可能です。”-j 300%”みたいに。多分

しかし、実行してみるとわかるのですが、command02parallel コマンド経由だと、ローカルホストで実行されてしまうんですね…。

“[GNU] parallel+ssh で複数のリモートホストに複数のコマンドを実行させる” の続きを読む

References   [ + ]

I. なお、”-j 3″はジョブを3つ並行起動する。です。大きくすれば同時実行数が増えます。CPU使用率での表現も可能です。”-j 300%”みたいに。多分