ルータを便利に遠隔制御しよう Capistrano

サーバ系のホストの管理は台数が増えると大変面倒になることは、運用のお仕事をされている人であればよくご存じだと思います。

世の中には、ホスト管理の課題を解決するためのツールとして Chef, Puppet, CFEngine や Capistrano などがあります。

翻ってルータに関しては、まだ決定打と呼べるほどの解決方法は無いのが現状だと思います。(SNMPはコンフィグ管理に不向きだし、NetConf は現状では機種依存度が高すぎだし..)

それでも、Unix OS系のルータアプライアンスであればホストと同じ仕掛けで簡単に管理することが出来てしまいます。

前置きが長くなってしまいましたが、今回のお題目は

を試してみます。

Capistrano

Capistrano は、複数のホストに対してコマンド実行などを実施する際に使うと便利なツールです。

Capistrano は管理対象の機器にソフトウェアをインストールする必要がありません。

コンフィグの管理については Puppet, Chef, CFEngine 等を使う方が良いですがバッチ処理的なことをさせるのであれば Capistrano が便利です。

Capistrano インストール

インストールはとても簡単です。以下のコマンドを管理サーバで実行するだけでインストールは完了します。

$ gem install -y capistrano
$ cap -h

vyatta + Capistrano

Capistrano では、rubyベースの 定義ファイル を記述することで「複数の環境に同じ処理を同時に実行させる」ことを実現します。

まずは、vyatta を例にコマンドを実行してみます。

set :user, "vyatta"
set :password, "(password)"

role :server, "(サーバのIPアドレス又はFQDN)"

desc "Test task"
task :show_route, :roles => :server do
run "~vyatta/run-cmd.sh show ip route"
end

上記の定義ファイルを "Capfile" という名前で保存し、以下のコマンドを実行します。

尚、vyattaのコマンドを投入する場合は前回紹介した ~vyatta/run-cmd.sh が必要になります。

(実行例)
$ cap show_route
* executing `show_route'
* executing "~vyatta/run-cmd.sh show ip route"
servers: ["192.168.0.1"]
[192.168.0.1] executing command
** [out :: 192.168.0.1] Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
** [out :: 192.168.0.1] I - ISIS, B - BGP, > - selected route, * - FIB route
** [out :: 192.168.0.1]
** [out :: 192.168.0.1] S>* 0.0.0.0/0 [210/0] via 192.168.192.5, eth0
** [out :: 192.168.0.1] C>* 127.0.0.0/8 is directly connected, lo
** [out :: 192.168.0.1] C>* 192.168.0.0/24 is directly connected, eth0
command finished in 141ms


SEIL/x86 + Capistrano

SEIL/x86 の場合は、定義ファイルに下記を追加する必要があります。

default_run_options[:shell] = false
default_run_options[:pty] = true

set :user, "user"
set :password, "(password)"

role :server, "(SEIL/x86IPアドレス又はFQDN)"

default_run_options[:shell] = false
default_run_options[:pty] = true

desc "WOL(Wake On Lan)"
task :wol, :roles => :server do
run "wol 00:11:22:33:44:55 interface lan0"
end

(実行例)
$ cap wol
* executing `wol'
* executing "wol 00:11:22:33:44:55 interface lan0"
servers: ["1.2.3.4"]
[192.168.0.1] executing command
command finished in 142ms