そうすると欲が出てきて、なんとか自動的にできないかなぁ、と思ってきた。
Linuxサーバからなんらかの方法でconfigが取れれば、あとはSVNのワーキングディレクトリに突っ込めばどうとでもなる。 ここがどうにかならないか、と調べて分かったのが、PerlのNet::Telnet::Ciscoモジュール。 Perlで、Ciscoデバイスにtelnet接続し、任意のコマンドを実行できるモジュールらしい。 これで入って、show running-config でも show startup-config でも実行すれば求めるものは取れる。 ということで、簡単なPerlスクリプトを書いてみた。 とりあえずget_config.plと命名。
./getconfig.pl -h <ホスト名> -p <パスワード> -e <特権モードパスワード> で、sh run 結果を返してくれる。 まぁ、最初と最後に若干情報が出るけど…。#!/usr/bin/perl # オプション解析モジュールのロード use Getopt::Long; # Ciscoコマンド操作モジュールのロード use Net::Telnet::Cisco; # IPアドレス my $host = ''; # ユーザ名 my $username = ''; # vtyログインパスワード my $password = ''; # ENABLEモード パスワード my $epassword = ''; GetOptions( 'host=s' => \$host, 'username=s' => \$username, 'password=s' => \$password, 'epassword=s' => \$epassword ); # Cisco.pm用オブジェクトの作成 -> ルータに接続 my $obj_Session= Net::Telnet::Cisco->new( Host => $host ); # vtyパスワードを用いてログイン $obj_Session->login($username, $password, ); # enable $obj_Session->enable( $epassword ); # コマンドの実行 @cmd_output = $obj_Session->cmd('show running-config'); # コマンド実行結果のアウトプット print "Last command: <", $obj_Session->last_cmd, ">\n"; print "Last error: <", $obj_Session->errmsg, ">\n"; print "Cmd output: <", @cmd_output, ">\n"; exit 0;
$ ./get_config.pl -h 172.xxx.xxx.xxx -p password -e enable_passwordここからシェルスクリプトの出番。 最初3行と最後1行は不要なので、続くシェルスクリプトで削る。 あと、やってみると分かるけどntp clock-periodはよく変わるので、有用な情報とは言えないので削る。 Ciscoデバイスの名前、IPアドレス、ログインパスワード、特権モードパスワードをスペース区切りでテキストファイルに保存。 cisco_file.txtとしよう。 こんな感じ。
Last command:
Last error: <> Cmd output: Current configuration : 18623 bytes ! ! Last configuration change at 11:58:40 JST Fri Aug 17 2012 ! NVRAM config last updated at 11:05:37 JST Sat Aug 11 2012 ! ~(省略)~ end
>
SVNのワークディレクトリを作っておく とりあえず
cisco_router1 172.xxx.xxx.xxx password1 enable_password1
cisco_router2 172.yyy.yyy.yyy password2 enable_password2
/home/foo/networks/trunk
にした
シェルスクリプトを実行すれば、指定したCiscoデバイスの設定ファイルを取って、SVNのワークディレクトリに書き込み。 で、SVNコミットさせる。 違いがあれば、コミットするし、なければコミットしない。 とそんな仕様のスクリプト。
#!/bin/bash
# Cisco機器のstartup-configファイルを取得し、リポジトリと違っていればコミットしておく
REPO=http://<リポジトリ>/networks/trunk
WORK_DIR=/home/foo/networks/trunk
PNAME=$( basename $0 )
# Cisco機器の名前、IPアドレス、ログインパスワード、Enableパスワードをスペース区切りで
CISCO_FILE=/home/foo/cisco_file.txt
get_config()
{
typeset HOSTNAME=$1
typeset HOST=$2
typeset PASSWD=$3
typeset ENABLE_PASSWD=$4
./get_config.pl -h $HOST -p $PASSWD -e $ENABLE_PASSWD | sed '/^ntp clock-period/d' | sed -e '1,3d' | sed -e '$d' > $WORK_DIR/${HOSTNAME}.config
}
while read LINE
do
get_config $LINE
done < $CISCO_FILE
if [ "$1" != "" ]
then
echo "You can commit by $ svn commit -m \"comments\" $WORK_DIR"
else
svn commit --username --password -m "Change detected. Automatically commited by $PNAME" $WORK_DIR
fi
これをcheckciscoconfig.shと命名して、crontabで毎晩23:30とかに仕込んでおけば、その日の変更は必ずコミットされる。30 23 * * * /home/foo/checkciscoconfig.sh > /dev/nullコメントは実態を反映していないけど、「忘れた!」よりマシという考え。
手動実行でちゃんとコメント付けてコミットしたいときは、
./checkciscoconfig.sh manual
とか、とにかく引数を与えてやれば設定ファイルだけをとってくるようになってます。
0 件のコメント:
コメントを投稿