2013年03月29日

pssh, pdshでもない! TakTukを使って複数ホストで並列・同時コマンド実行・ファイル転送する

SSHを利用した複数ホストの並列・自動管理といえば psshpdshParallel、並列・同時実行ではありませんが Capistrano なんて名前が頭に浮かぶんじゃないでしょうか。今日はこれら日本で有名(?)なプロダクトにも引けを取らないPerlベースの並列・自動化ツール TakTuk を紹介します。

media-seek-forward-8



TakTuk の概要


TakTuk はPerlベースでコーディングされた並列・同時実行ユーティリティで、ターゲット・ホストへはSSHプロトコルを使ってアクセスし、CLIコマンド・ファイル送受信・Perlスクリプトの実行が可能です。

taktuk_01

TakTukを利用する為には次の条件を満たす必要があります。

  • 最低1台のホストにTakTukがインストールされていること
  • TakTukホストと管理ターゲットとなるホスト間はSSH公開鍵認証(パスフレーズ無し)が利用可能なこと
  • 全てのホスト間で共通のユーザIDが利用できること

公開鍵認証が必須というのが少し面倒な気もしますが、この作業以外に管理ホストに何かエージェントをインストールするといった手間は必要ありません。

また、嬉しい点として、TakTukはGatewayホストの指定をサポートしており、直接アクセス出来ない管理ホストが存在する場合にも一箇所のTakTukホストから全てのホストを制御することが可能です。

taktuk_02


TakTuk のインストールと環境設定


TakTuk プロジェクト・ホームはこちら。

TakTuk

Downloadページを見ると分かりますが、aptパッケージ管理が利用できる、例えばUbuntuであれば次のコマンドで簡単にインストールすることが出来ます。

$ sudo apt-get install taktuk

その他のディストリビューションであればtarボールをダウンロード、ビルドします。

$ tar xvzf taktuk-3.7.4.tar.gz
$ cd taktuk-3.7.4
$ ./configure
$ make
$ sudo make install

これでインストールはおしまい。 ただし、TakTukホストから管理ホストへはパスフレーズ無しの公開鍵認証でログイン出来ることが利用条件になるのでこちらも設定してあげます。

まずは、TakTukホストでパスフレーズ無しの公開鍵を作成。

TakTuk $ ssh-keygen -N "" -t rsa

続いて作成した公開鍵($HOME/.ssh/id_rsa.pub)を管理ホストにコピー、authorized_keysに登録しましょう。

Target $ cat /path/to/id_rsa.pub (TakTuk public key) >> .ssh/authorized_keys
Target $  chmod 600 ~/.ssh/authorized_keys
※~/.sshが無い場合、まず最初に mkdir ~/.ssh, chmod 700 ~/.ssh する。

話は逸れますが、もし、ssh-copy-idコマンドが使えるならば、もっと簡単に鍵登録することも出来ますよ。

TakTuk $ ssh-copy-id root@Target

ここまで終わったら、一度TakTukホストからターゲット・ホストへパスフレーズ無しでSSHログイン出来ることを確認しておきます。

TakTuk $ ssh -l root 192.168.x.x

Last login: Fri Mar 29 20:23:13 2013 from 192.168.x.x [root@Target ~]#

さあ、これで全ての準備が整いました。


TakTukの使い方


まず、最もシンプルな使い方から。 管理ホスト上でhostnameコマンドを実行してみます。

$ taktuk -s -l root -m Host-A -m Host-B broadcast exec [ hostname ]

指定した各オプションの意味は次の通り。

-s : ターゲット(管理)・ホストにTakTukがインストールされていないことを示す。
-l : SSHセッションで利用するユーザID。
-m : ターゲット・ホスト。 その値としてホスト名又はIPアドレスを指定する。
bloadcast : 全てのターゲット・ホストにコマンドを実行する。
exec [ command ] : 実行コマンド。 書式は exec [ command ]で指定する。


実行結果は次の通り。

host-A-2: hostname (17635): output > Hostname-A
host-B-1: hostname (25668): output > Hostname-B
host-B-1: hostname (25668): status > Exited with status 0
host-A-2: hostname (17635): status > Exited with status 0

リモート・ホスト上でのコマンド実行結果(出力)と終了ステータスが表示されました。

この例はワンライナーでしたが対話的なコマンド実行も可能。

$ taktuk -l root -m host-A

broadcast exec { hostname } host-A-1: hostname (22994): output > hostname-A host-A-1: hostname (22994): status > Exited with status 0 broadcast exec { free } host-A-1: free (22997): output > total used free shared buffers cached host-A-1: free (22997): output > Mem: 774452 737172 37280 0 41068 434732 host-A-1: free (22997): output > -/+ buffers/cache: 261372 513080 host-A-1: free (22997): output > Swap: 524280 208 524072 host-A-1: free (22997): status > Exited with status 0

対話モードは Ctrl + D で終了出来ます。


今度はファイルを転送してみましょうか。これは次のような書式になります。

$ taktuk -s -l root -m Host-A -m Host-B broadcast put [ data.zip ] [ /tmp ]

もう、詳しい説明は必要無いですね。 putでローカル・ファイルと転送先パスを指定しているだけです。


逆にリモート・ホスト上のファイルをローカルにgetする場合にはファイル名が重複しないよう、少し知恵を使います。

$ taktuk -s -l root -m host-A -m host-B broadcast exec [ 'cp /var/log/messages /tmp/messages.`hostname`' ]

host-B-2: cp /var/log/messages /tmp/messages.`hostname` (15350): status > Exited with status 0 host-A-1: cp /var/log/messages /tmp/messages.`hostname` (23300): status > Exited with status 0

$ taktuk -s -l root -m Host-A -m Host-B broadcast get [ '/tmp/messages.`hostname`' ] [ /tmp ]
$ ls /tmp/messages* /tmp/messages.hostname-A /tmp/messages.hostname-B

/var/log/messagesファイルをターゲット・ホスト上でホスト名付きのファイルとしてcpし、これをローカルにgetしてみました。


え、何度も-mオプションでホストを指定するのが面倒だ?、そういう時にはホストをリストしたファイルを作成しておき、-fオプションで指定しましょう。

$ cat machine.txt
172.16.0.x
172.16.0.x
172.16.0.x

$ taktuk -s -l root -f machines.txt broadcast exec [ command ]

直接アクセス出来ないホストがある場合は、-Gオプションで踏み台になるホストを指定します。

$ taktuk -s -l netbuffalo -G 192.168.1.254 -[ -m 172.16.0.10 -] -m 192.168.1.100 broadcast exec [ hostname ]

172.16.0.10-1: hostname (16949): output > Hidden-host 172.16.0.10-1: hostname (16949): status > Exited with status 0 192.168.0.100-2: hostname (16439): output > Reacheble-host 192.168.0.100-2: hostname (16439): status > Exited with status 0

この例では、直接到達できない172.16.0.0ネットワーク上に存在する172.16.0.10に関しては、双方のネットワークに到達可能な192.168.1.254をゲートウエイ・ホストに指定してコマンド実行しています。


最後はPerlスクリプトの実行。 当然全てのホスト上でPerlが使えることが条件ですが、TakTukホスト上で作成したPerlスクリプトを指定・実行することも出来ます。

簡単なPerlスクリプトを作っておいて、

#!/usr/bin/perl
use Sys::Hostname;
$hostname = hostname(); print "hello taktuk on $hostname \n"

これをTakTuk経由で実行した結果がこちら。

$ taktuk -s -l root -m Host-A -m Host-B broadcast taktuk_perl [ - ]\;broadcast input file [ host.pl ]

host-A-2: taktuk_perl - (15924): output > hello taktuk on hostname-A host-B-1: taktuk_perl - (24107): output > hello taktuk on hostname-B host-A-2: taktuk_perl - (15924): status > Exited with status 0 host-B-1: taktuk_perl - (24107): status > Exited with status 0


興味が出てきた?、もっと詳しい使い方はこちらからどうぞ。


それでは、より良いシステム管理ライフを!


Linuxサーバ Hacks 2 ―コネクティング、モニタリング、トラブルシューティング
Bill von Hagen Brian K. Jones
オライリー・ジャパン
売り上げランキング: 303,280

サーバ管理技術入門 (ネットワーキング入門シリーズ)
笠野 英松
翔泳社
売り上げランキング: 483,421

Posted by netbuffalo at 21:30│Comments(0)TrackBack(0)ユーティリティ | Linux


この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/netbuffalo/4418088

コメントする

名前
URL
 
  絵文字