複数のサーバーに同じ設定をするために色々な方法があると思いますが、 直接操作したい時に同じコマンドを送れたら便利です。
その様な方法もいくつかありますが、tmuxを使うと実際のターミナル操作を 全てのサーバーに同時に送ることが出来ます。
その様な状態を簡単に作るためのpo(Parallel Operations)というスクリプトを作ってみました。
Parallel Operation
Tmuxのsynchronize-panes
という機能を使って
複数のサーバーを同時に操作するためのスクリプトです。
インストール
MacでHomebrewなら
$ brew install rcmdnk/rcmdnkpac/po
それ以外の場合は
$ curl -fsSL https://raw.github.com/rcmdnk/ParallelOperation/install/install.sh| prefix=~/usr/ sh
でインストールできます(これだと~/usr/bin/poに、。prefix
なしなら/usr/local/bin/poに。)
もしくはbin/poをパスの通ったディレクトリに入れてください。
ただのシェルスクリプトなのでほとんどの環境で動くはずです。
必要なものはこのスクリプト以外にはTmuxが必要です。
tmux 1.6と2.7でテストしてあります。
使い方
$ po <host1> <host2> ...
と繋げたいホストを羅列するだけです。
もし、ユーザー名や鍵を指定したい場合には
$ po -- [email protected] "-i ~/.ssh/my_key example2.com"
といった感じにそれぞれのまとまりで通常のsshオプションを付けることが可能です。
ホスト指定のかたまりをクォートするのとホストの指定前に--
を入れるのを忘れずに。
(これがないと後ろの-i
とかをシェルスクリプトが解釈しようとしてしまうので。)
また、
$ po -l user1 -i ~/.ssh/my_rsa-- example1.com example2.com
と、-l
、-i
オプションを直接po
に渡すことも出来、
この場合は全てのホストにこれらのオプションが加えられます。
名前が数字の順になってるものなら
$ po example{1..4}.com
の様にすると簡単に複数に繋げられます。。
例
こんな感じで同じコマンドを複数のサーバーに同時に送れます。
謝辞
このスクリプトですが、 以下のブログポストを参考にしています。
参考、というよりほぼそのままでちょっと使いやすいようにオプション加えただけですが。
tmuxって便利ですね。
その他のツール
Parallel-ssh
tmux以外にはParallel-sshというコマンドがあります。
Google Code Archive - Long-term storage for Google Code Project Hosting.
こちらはpssh
というコマンドを使って一斉に各サーバーにコマンドを送ってその返信を見る、といいった感じのコマンドです。
各サーバーにコマンドを送り、コマンドが終了したらその出力が表示されます。 この際、終わった順に順次表示されていきます。
複数のコマンドを送りたい場合にはその都度pssh
を行うことになります。
かなり古いツールで2012年が最後のリリースで、Google CodeからGitHubへの移行も行われないままになっていますが 今でも十分に使えます。
決まったコマンドをちょっと送りたいだけなら便利です。
$ brew install pssh
$ yum install pssh
$ apt-get install pssh
などでインストールできます。
使い方は
$ pssh -H example1.com -H example2.com -H example3.com -i "hostname -i"
[1] 11:15:01 [SUCCESS] example1.com
192.168.1.2
[2] 11:15:03 [SUCCESS] example3.com
192.168.1.4
[2] 11:15:04 [SUCCESS] example2.com
192.168.1.3
といった感じ。
-H
でホスト名を指定します。2つ目以降にも-H
を付けて指定していきます。
もしくは
esample1.com
esample2.com
esample3.com
といったホストを羅列したファイル(hosts.txtとする)を用意して
-h hosts.txt
と指定すると上と同じことが出来ます。
-h
と-H
の併用も可能です。
-i
を与えないとコマンドだけ実行して出力は表示しない様になります。
他のオプションとしては-l
で共通のユーザー指定、
-A
で共通のパスワード入力をすることが出来たりします。