RANCID+ViewVCでコンフィグ管理
いままでは perl-Expect で自動的にコンフィグとってきてタイムスタンプベースのファイル名にして保存する、というスクリプトを回していた。それでおおむね不都合がなかったのだけど、機材増えてきたのでもうちょっと自動化してしまおうと。…というと、別に今だって常に動いているデバイスは3台くらいなのだからそんなに変える必要ないのだけど。でも差分とったりするのもなかなか面倒だしね。RANCID でその辺は今後管理するようにしてみることに。一回使ってみようとは思っていたしね。
サーバは Debian/6.0.3(squeeze) です。
RANCID
参考
- Shrubbery Networks, Inc. - RANCID
- RANCID using SVN and ViewVC - Gentoo Linux Wiki
- RANCID で IOS の設定変更履歴を管理 - Fedora Wiki
インストール
必要なパッケージ類を入れる
# aptitude install rancid rancid-cgi rancid-core rancid-util # aptitude install subversion
これだけ。Version Control System については、RANCID は RCS, CVS, Subversion に対応している。デフォルトは CVS だけどまあいまさら CVS でもあるまい(もう使い方覚えてないし)。ということで今回は Subversion を選択。
あと、インストール時点で user:rancid も作られる。
$ id rancid uid=114(rancid) gid=121(rancid) groups=121(rancid)
設定
設定ファイルを変更。
--- rancid.conf.orig 2011-12-04 00:47:10.000000000 +0900 +++ rancid.conf 2011-12-04 01:51:57.000000000 +0900 @@ -21,14 +21,14 @@ BASEDIR=/var/lib/rancid; export BASEDIR PATH=/usr/lib/rancid/bin:/usr/bin:/usr/sbin:/bin:/usr/local/bin:/usr/bin; export PATH # Location of the CVS/SVN repository. Be careful changing this. -CVSROOT=$BASEDIR/CVS; export CVSROOT +CVSROOT=$BASEDIR/SVN; export CVSROOT # Location of log files produced by rancid-run(1). LOGDIR=$BASEDIR/logs; export LOGDIR # # Select which RCS system to use, "cvs" (default) or "svn". Do not change # this after CVSROOT has been created with rancid-cvs. Changing between these # requires manual conversions. -RCSSYS=cvs; export RCSSYS +RCSSYS=svn; export RCSSYS # # if ACLSORT is NO, access-lists will NOT be sorted. #ACLSORT=YES; export ACLSORT @@ -61,7 +61,7 @@ #PAR_COUNT=5; export PAR_COUNT # # list of rancid groups -#LIST_OF_GROUPS="sl joebobisp" +LIST_OF_GROUPS="my_ap my_router my_switch" # more groups... #LIST_OF_GROUPS="$LIST_OF_GROUPS noc billybobisp" #
- CVSROOT については Subversion なので "SVN" にしてみた。
- LIST_OF_GROUPS は、今回登録するのは3台だけだから、実用上ここまで細かく分ける必要は特にないんだけど、まあ適当に分類をつくっておく。
最小限の設定だと上の通りなのだけど、あとこれくらいは変えた方がいいだろうな…
- FILTER_PWDS: パスワードを隠す。デフォルトは "YES" で、これは type7 password は隠してくれるのだけど、secret password は隠してくれないという状態。"ALL" にすれば全部隠してくれる。
- NOCOMMSTR: SNMP Community String を隠す。これもデフォルトは "YES" になっているので "ALL" にしておく。
次はデバイスへのログインアカウント情報の作成。rancid.conf にある $BASEDIR に置く。当然これは隠さなくてはいけない情報なので、オーナー・パーミッション設定をちゃんとやること。(個人的にはこの辺もうちょっと堅くなってくれるといいなあと思いつつ)
/var/lib/rancid# cat .cloginrc # syntax # add user (device) (username) # add password (device) (telnet-password) (enable-password) # add method (device) (method) add user * stereocat add password * hogehoge foobar add method * ssh /var/lib/rancid# chmod 600 .cloginrc /var/lib/rancid# chown rancid:rancid .cloginrc /var/lib/rancid# ls -l .cloginrc -rw------- 1 rancid rancid 181 Dec 4 01:11 .cloginrc /var/lib/rancid#
いまどの機器もユーザやパスワードを同じにしてしまっているのでこれだけ。もちろんデバイス別にアカウントやパスワード情報を定義することもできる。ログイン時特権設定(username foo privilege 15)しててログイン後すぐ Enable mode だったりするようなケースにはまたちょっと書き方が変わるのでその辺はリファレンスを参照すること。
リポジトリの作成
次はリポジトリの作成。$BASEDIR の下に $LIST_OF_GROUPS で定義したディレクトリができてこれがリポジトリになる。
/var/lib/rancid# sudo -u rancid -H ./bin/rancid-cvs Committed revision 1. Checked out revision 1. At revision 1. A configs Adding configs Committed revision 2. A router.db Adding router.db Transmitting file data . Committed revision 3. Committed revision 4. Checked out revision 4. At revision 4. A configs Adding configs Committed revision 5. A router.db Adding router.db Transmitting file data . Committed revision 6. Committed revision 7. Checked out revision 7. At revision 7. A configs Adding configs Committed revision 8. A router.db Adding router.db Transmitting file data . Committed revision 9. /var/lib/rancid# /var/lib/rancid# ls -l total 44 drwxr-x--- 6 rancid rancid 4096 Dec 4 01:53 SVN lrwxrwxrwx 1 root root 19 Dec 4 00:39 bin -> /usr/lib/rancid/bin -rwxr-xr-x 1 root root 3734 Jun 8 2010 downreport -rwxr-xr-x 1 root root 5185 Jun 8 2010 getipacctg drwxr-x--- 4 rancid rancid 4096 Dec 4 01:53 my_ap drwxr-x--- 4 rancid rancid 4096 Dec 4 01:53 my_router drwxr-x--- 4 rancid rancid 4096 Dec 4 01:53 my_switch drwxr-x--- 2 rancid rancid 4096 Dec 4 01:53 logs -rwxr-xr-x 1 root root 5866 Jun 8 2010 rtrfilter /var/lib/rancid#
/var/lib/rancid# cat ROUTER/router.db edge:cisco:up /var/lib/rancid# cat SWITCH/router.db core:cisco:up /var/lib/rancid# cat WLAN_AP/router.db ap:cisco:up /var/lib/rancid#
デバイス名(edge, core, ap) は /etc/hosts に登録してある。ちなみに
という布陣。
テスト
まずはログインテスト。
/var/lib/rancid# sudo -u rancid ./bin/clogin edge edge spawn ssh -c 3des -x -l stereocat edge Password: edge>enable Password: edge#exit Connection to edge closed. /var/lib/rancid#
自動的にログインして enable まではいってくれるのが確認できたら exit して終わり。ログイン時の挙動がうまくいっていないようであれば .cloginrc とかの設定を見直してみる。(たとえば、clogin は ログイン → enable しようとしているのに privilege 15 されてるアカウント使っててログイン直後 enable された状態になっているという場合は expect が次の動作を拾えなくて止まる。このへんは expect の動作を知っていればわかるだろうけど…)
ログインがうまくいっているようであれば RANCID を実行してみる。
/var/lib/rancid# sudo -u rancid -H ./bin/rancid-run /var/lib/rancid#
ちょっと時間かかる。実行できていればログができてるので確認。
/var/lib/rancid# ls -l ./logs/ total 12 -rw-r----- 1 rancid rancid 382 Dec 4 02:04 my_ap.20111204.020442 -rw-r----- 1 rancid rancid 393 Dec 4 02:05 my_router.20111204.020452 -rw-r----- 1 rancid rancid 393 Dec 4 02:05 my_switch.20111204.020507 /var/lib/rancid# cd logs /var/lib/rancid/logs# cat my_ap.20111204.021338 starting: Sun Dec 4 02:13:38 JST 2011 At revision 12. Trying to get all of the configs. All routers sucessfully completed. Sending . Sending configs/ap Sending router.db Transmitting file data .. Committed revision 13. ending: Sun Dec 4 02:13:47 JST 2011 /var/lib/rancid/logs#
問題なければ cron に登録する。
# crontab -u rancid -e 47 5 * * * /usr/bin/rancid-run 47 6 * * * /usr/bin/find /var/lib/rancid/logs -type f -mtime +7 -exec rm {} \;
そんなにしょっちゅう変更するわけでもないし、日に1回にしておく。作業やるときは手動で rancid-run コマンド実行すればよいやと。
ViewVC
RANCID リポジトリを参照するように ViewVC をつかう。
インストール
# aptitude install viewvc viewvc-query
設定(ViewVC)
- /etc/viewvc/viewvc.conf
--- viewvc.conf.orig 2011-12-04 02:23:44.000000000 +0900 +++ viewvc.conf 2011-12-04 14:53:26.000000000 +0900 @@ -129,6 +129,7 @@ ## /opt/cvs : cvs ## #root_parents = +root_parents = /var/lib/rancid : svn ## default_root: This is the name of the default root. Valid names ## include those explicitly listed in the cvs_roots and svn_roots @@ -568,6 +569,7 @@ ## use_localtime: Display dates as UTC or in local time zone. ## #use_localtime = 0 +use_localtime = 1 ## short_log_len: The length (in characters) to which the most recent ## log entry should be truncated when shown in the directory view.
参考にあげたリンク先とかだと root_parents 使った方法じゃなくて svn_roots 使った設定書いてあって、そっちを先に試したんだけどなぜか上手く動かなかったため svn_parents 使った方法へ変更。原因調査はまだしてないのだけど、これで特に不都合がないのでたぶんちゃんと調べないな…。
RANCID の調整
ViewVC でまず邪魔なのが、"exec prompt timestamp" しているためについてくる show コマンド実行時の時刻表示。毎度必ずこれが差分として出てきてしまう。これくらいなにか回避方法があるだろう…と思って探したらやっぱりあった。
--- rancid.orig 2011-12-04 14:39:35.000000000 +0900 +++ rancid 2011-12-04 14:40:52.000000000 +0900 @@ -1874,9 +1874,20 @@ # dummy function sub DoNothing {print STDOUT;} +sub DoNothing { + print STDERR " In DoNothing: $_" if ($debug); + + while (<INPUT>) { + tr/\015//d; + last if (/^$prompt/); + next if (/^(\s*|\s*$cmd\s*)$/); + } + return 0; +} # Main @commandtable = ( + {'terminal no exec prompt timestamp' => 'DoNothing'}, {'admin show version' => 'ShowVersion'}, {'show version' => 'ShowVersion'}, {'show redundancy secondary' => 'ShowRedundancy'},
RANCID の vty セッションでは "terminal no exec prompt timestamp" 実行して timestamp 取得しないようにしてしまえばよい、と。パッチ前後で差分比較すると時刻が消えてることが確認できる。