RANCID+ViewVCでコンフィグ管理

いままでは perl-Expect で自動的にコンフィグとってきてタイムスタンプベースのファイル名にして保存する、というスクリプトを回していた。それでおおむね不都合がなかったのだけど、機材増えてきたのでもうちょっと自動化してしまおうと。…というと、別に今だって常に動いているデバイスは3台くらいなのだからそんなに変える必要ないのだけど。でも差分とったりするのもなかなか面倒だしね。RANCID でその辺は今後管理するようにしてみることに。一回使ってみようとは思っていたしね。

サーバは Debian/6.0.3(squeeze) です。

RANCID

参考

インストール

必要なパッケージ類を入れる

# aptitude install rancid rancid-cgi rancid-core rancid-util
# aptitude install subversion

これだけ。Version Control System については、RANCIDRCS, 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 使った方法へ変更。原因調査はまだしてないのだけど、これで特に不都合がないのでたぶんちゃんと調べないな…。

設定(Apache)
/etc/apache2/conf.d$ cat viewvc.conf
ScriptAlias /viewvc /usr/lib/cgi-bin/viewvc.cgi
<Directory "/usr/lib/cgi-bin">
     Options -indexes +ExecCGI
</Directory>
/etc/apache2/conf.d$

アクセスコントロールの設定とかは後はお好みで追加すべし。

apache 設定+プロセス再起動させれば http://localhost/viewvc へアクセスすると RANCID リポジトリが見える。

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 取得しないようにしてしまえばよい、と。パッチ前後で差分比較すると時刻が消えてることが確認できる。