RANCIDでVyatta/VyOSのコンフィグを管理する

はじめに

自宅のサーバ環境を一部更新するのにあたってついでなので VyOS/1.1.0 のインストールをしてみました。
こんな感じで、2台の hypervisor 上に VyOS/1.1.0 と VC/6.3 が乗っています。VLAN 101, 103 はそれぞれ hypervisor 上の物理的に異なる NIC で接続されているので、片側の Hypervisor の VLAN101 用 NIC (uplink) が壊れてももう片側の hypervisor から接続できるようになっています。といっても VLAN 101,103 を収容するスイッチは1台なのでたいした意味ないですが…。どちらかというと無駄に階層 OSPF 作ってみたかったってだけか。

RANCIDでコンフィグ管理


さて。こうして複数ルータ管理するとなると、コンフィグの自動バックアップや変更管理をやりたいと思うわけです。まあ、もともと RANCID+ViewVCでコンフィグ管理 しているので、そこに乗っけてしまおうと。Vyatta 1台だけでずっとやってたときは、ベースのコンフィグ採っておけばまあ後は何とかなっちゃうので放置していましたが、この際まとめて RANCID でとるようにしちゃおうと。

RANCID 導入したのが 2011 年 12 月ということでほぼ 3 年前…。もしかしたら今やるには古いのでは、という気がするけどそう違ってないでしょうおそらく。

"RANCID Vyatta" とかで検索すると

というのが出てきたのでこれを使ってみます。

ダウンロードとインストール

git clone するか zip 落として解凍します。

~/vyatta-rancid$ ls
LICENSE  README.md  vlogin  vrancid
~/vyatta-rancid$

vlogin, vrancid を rancid$BASEDIR/bin にコピーします。いまの環境では $BASEDIR=/var/lib/rancid です。

/var/lib/rancid/bin$ ls -l | egrep -e' v[login|rancid]'
-rwxr-xr-x 1 root root 13910 Nov 23 12:39 vlogin
-rwxr-xr-x 1 root root  9246 Nov 23 14:22 vrancid
/var/lib/rancid/bin$
バイスクラスの追加

この $BASEDIR/bin は各ベンダ・各種機器ごとの expect script 類が入っているのですが、どのデバイスに対してどのコマンドを使うかという情報が $BASEDIR/bin/rancid-fe の中にあるので、それを編集してやります。

--- rancid-fe.orig      2014-11-23 12:46:19.000000000 +0900
+++ rancid-fe   2014-11-23 12:46:48.000000000 +0900
@@ -82,7 +82,8 @@
     'riverstone'       => 'rivrancid',
     'smc'              => 'srancid',
     'tnt'              => 'tntrancid',
-    'zebra'            => 'zrancid'
+    'zebra'            => 'zrancid',
+    'vyos'             => 'vrancid'
 );

 if ($vendortable{$vendor} eq "") {
バイスの登録

追加したデバイスクラス("vyos")で VC/VyOS を登録してやります。(ここでは $LIST_OF_GROUPS="router switch" みたいになっています。)

/var/lib/rancid/router# ls
configs  router.db  routers.all  routers.down  routers.up
/var/lib/rancid/router# cat router.db
edge:cisco:up
rtr6:cisco:up
vyatta:vyos:up
vyos:vyos:up
/var/lib/rancid/router#

なお、各ルータは OS そのまま "vyatta", "vyos" というホスト名にしてしまっていて、ホスト名を hosts に書いちゃってます…こうして見ると紛らわしいな…。

あ、あと、ルータへのログイン情報(アカウント情報) $BASEDIR/.cloginrc も必要に応じて適宜編集してください。宅内環境だとルータへのログイン情報は統一しちゃってるので今回は特にいじってないです…。

動作確認

順序的には、動作チェックはデバイスの登録する前の方がいいか…。

自動ログイン

vlogin コマンドで自動ログインできるかどうかを試しましょう。

/var/lib/rancid$ sudo -u rancid bin/vlogin vyos
vyos
spawn ssh -c 3des -x -l stereocat vyos
Welcome to VyOS
stereocat@vyos's password:
Linux vyatta 3.13.11-1-amd64-vyos #1 SMP Wed Sep 3 20:04:22 UTC 2014 x86_64
Welcome to VyOS.
This system is open-source software. The exact distribution terms for
each module comprising the full system are described in the individual
files in /usr/share/doc/*/copyright.
Last login: Mon Nov 24 05:47:12 2014 from 192.168.2.16

stereocat@vyos:~$
stereocat@vyos:~$ exit
logout
Connection to vyos closed.
/var/lib/rancid$
自動ログイン+コマンド実行

-c でコマンドを渡すだけ。これ、RANCID 実行時のデバッグに使います。

/var/lib/rancid$ sudo -u rancid bin/vlogin -c"show version" vyos
(略)
stereocat@vyos:~$
stereocat@vyos:~$ set terminal length 0
stereocat@vyos:~$ show version
exit
Version:      VyOS 1.1.0
Description:  VyOS 1.1.0 (helium)
Copyright:    2014 VyOS maintainers and contributors
Built by:     maintainers@vyos.net
Built on:     Thu Oct  9 22:27:26 UTC 2014
Build ID:     1410092227-af6433f
System type:  x86 64-bit
Boot via:     image
Hypervisor:   VMware
HW model:     VMware Virtual Platform
HW S/N:       VMware-56 4d 96 d9 68 0d 2f d4-ee 07 e0 6d 78 bd 18 88
HW UUID:      564D96D9-680D-2FD4-EE07-E06D78BD1888
Uptime:       12:08:06 up 1 day, 17 min,  1 user,  load average: 0.00, 0.01, 0.05


stereocat@vyos:~$ exit
logout
Connection to vyos closed.
/var/lib/rancid$
rancid 実行

RANCID はいくつか情報取得用のコマンドを投げて、バージョンコントロールしてくれます。rancid-run コマンドは特定デバイスに対してだけ実行することもできます。

/var/lib/rancid$ sudo -u rancid bin/rancid-run -r vyos
(略)

ログは $BASEDIR/logs に出力されているのでチェックしましょう。

VC 向け注意

上の vlogin -c の実行結果で気づけばよかったんですが、rancid-run -r vyatta したら expect がタイムアウトしてしまいました。結論から行くと、VC6.3 に対して show configuration したときに more (pager) 処理ができていなくて止まっていたという話なんですが、ページャをオフにするコマンドが違うんだよね。

  • VC6.3: terminal length 0
  • VyOS: set terminal length 0

やるんだったら vloginset terminal length 0 投げてる当たりをいじるんだろうけど、今回はちょっと姑息な手で逃げています。あんまりいい方法じゃないけど…*1

--- /home/stereocat/vyatta-rancid/vrancid       2014-11-23 12:38:53.000000000 +0900
+++ vrancid     2014-11-23 14:22:57.000000000 +0900
@@ -217,9 +217,9 @@

 # Main
 @commandtable = (
-       {'show version'         => 'ShowConfiguration'},
-        {'show configuration'           => 'ShowConfiguration'},
-        {'show configuration commands'  => 'ShowConfiguration'},
+       {'show version | no-more'         => 'ShowConfiguration'},
+        {'show configuration | no-more'           => 'ShowConfiguration'},
+        {'show configuration commands | no-more'  => 'ShowConfiguration'},
 );
 # Use an array to preserve the order of the commands and a hash for mapping
 # commands to the subroutine and track commands that have been completed.

*1:別途 "vyatta" クラスを作って vlogin/vrancid を別名でコピーしてページャをオフにするコマンド書き換えて…とかやるのもそれはそれで無駄だなあ、と。VC は前に作ったのをそのまま使ってるけど、今後これに対してどうこうするという話は基本ナイので。