2018年6月14日

ブロードバンドタワー國武です。

ネットワーク機器の設定情報ってどうやって管理してますか?

最近は、NAPALM, Ansibleなどが自動化などで利用されることも多く、そちらのツールを駆使して運用する方が注目度は高いでしょうか?ただ何と言っても、その先駆けとして有名なのは rancid だと思ってます。主に Shell + expect + Perl で作られたツールで、スイッチ、ルータ、ロードバランサなどなど、ネットワーク機器の設定情報を取得し、それらをバージョン管理システムのリポジトリに入れて変更管理を容易にしてくれるツールです。

最近?では cvs や subversion だけでなく git にも標準で対応するなど、まだまだ開発は続いており、流行り廃れの激しいこの業界にしては、安心して使えるツールです。

これからも、まだまだ活用できるツールだと思うので、何回かに分けて rancid とその活用方法をご紹介したいと思います(現時点でそう思っているだけで、全部は書かないかも?)

第一回 rancid を試す 〜温故知新〜
第X回 rancid のちょっとした改造(commitログを記録できるようにする)
第二回 rancid の管理対象機器として、仮想ルータを立ち上げてみる
第三回 rancid の設定と運用の話
第四回 rancid と bash-completion
第五回 rancid と gitbucket/redmine との連動
第六回 rancid の対応機種を増やしてみる Alaxala 編
第七回 rancid と Grafana + Influxdb との連動

#rancid のちょっとした改造、とブログ記事にしようと思っていた機能が、モタモタしてる間に本家で機能実装されてしまった……

個人的なボヤキはさておき、まず第一回目は rancid の紹介とそのインストールについて触れたいと思います

目次

  1. Rancidとは
  2. Rancid をインストールする
  3. Rancid の設定ファイル
  4. 次回予告

Rancidとは

本家サイトは下記の通りです。

RANCID – Really Awesome New Cisco confIg Differ

Rancid がどんなツールかはすでに前段で書いてしまいましたが、少し細かく書くと

  1. ネットワーク機器にログインする
  2. 決められたコマンドを実行する(show int や show run など)
  3. 得られた出力を一部加工したりする
  4. 前回実行した時からの差分をメールで通知する
  5. git などのバージョン管理ツールにデータを commit する

といった動きをします。3.得られた出力を一部加工、というのは、例えば show int した結果のその差分だけだとわかりづらいので、down/up だけに注目して加工し、差分として Interface の down/up をわかりやすく表示できるようにしたり、ネットワーク機器の設定にあるパスワード情報などをリポジトリに入れたくない場合に備えて、そこだけ **** などでマスクするといったことをしてくれたりします(機種によって、対応、非対応などの差はそれなりにあるので、この部分にあまり過度な期待は持たない方がいいかもしれません)
また沢山の機器を効率よくデータを取得するための工夫もされていて、裏ではパラレルでデータ取得をしてたりします(なんてことを書いてますが、実はそんな気の利いた処理はしてないと思い込んでて、本体に手を入れずにパラレルで動かすようにプログラムを書いてました。で、その動作検証してる最中に Rancid、それ自身でパラレルに各ネットワーク機器へログインし、効率的にデータ取ってきており、自分がまったくムダなことをしてたことが判明……)

また、上記の 2. 決められたコマンドを実行するに関してですが、実は設定情報を取ってくるといったようなRancid標準の予め決まっている動作だけでなく、明示的に実行したいコマンドを指定して実行させることもできるので、たとえば「RMA処理を依頼するときにはこの複数の定型コマンドを打つのが決まりになっている」……なんて時は、Rancid にまかせてサクッと取ってきてしまうという運用もできると思います。

Rancid をインストールする

RHEL/CentOSなどは EPELリポジトリを参照していれば、パッケージ導入できます。ただ、このパッケージは git を有効にして生成されていなかったり、バージョンが古かったりするので、ちょっと手間ですが、このパッケージを元に rancidパッケージを作り直してみましょう。

まず、EPELリポジトリにアクセスできるようにします。

$ sudo yum install epel-release

これで rancidの src.rpmファイルにアクセスできるようになりました。以下は、yum-utils, rpm-build, rpmdevtools がインストール済みだとして説明してきます。

手元に rancid の src.rpmファイルをダウンロードします

$ yumdownloader --source rancid

これで rancid-3.2-2.el7.src.rpm といったファイルがカレントディレクトリにDownloadされたはずです。このパッケージを作業用ユーザ権限でインストールします。この作業にroot権限は不要です。

$ rpm -ivh  rancid-3.2-2.el7.src.rpm
更新中 / インストール中...
   1:rancid-3.2-2.el7                 ################################# [100%]
警告: ユーザー mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザー mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザー mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザー mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザー mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザー mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザー mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザー mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザー mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザー mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザー mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザー mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザー mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します

なにやらいろいろ怒られますが、無視してOKです。これで ~/rpmbuild に関連ファイルがDownloadされました。

[vagrant@localhost ~]$ find rpmbuild/ -type f -print
rpmbuild/SOURCES/rancid-3.2.p1
rpmbuild/SOURCES/rancid-3.2.p2
rpmbuild/SOURCES/rancid-3.2.p3
rpmbuild/SOURCES/rancid-3.2.p4
rpmbuild/SOURCES/rancid-3.2.p5
rpmbuild/SOURCES/rancid-3.2.p6
rpmbuild/SOURCES/rancid-3.2.p7
rpmbuild/SOURCES/rancid-3.2.tar.gz
rpmbuild/SOURCES/rancid-Makefile.patch
rpmbuild/SOURCES/rancid-conf.patch
rpmbuild/SOURCES/rancid.cron
rpmbuild/SOURCES/rancid.logrotate
rpmbuild/SPECS/rancid.spec

ついでに、コンパイルに必要なパッケージもインストールしておきます。

$ sudo yum-builddep ~/rpmbuild/SPECS/rancid.spec

現時点の最新に Rancidは 3.7 なので、このソースコードをダウンロードします。

$ cd ~/rpmbuild/SOURCES
$ wget ftp://ftp.shrubbery.net/pub/rancid/rancid-3.7.tar.gz

この 3.7 でパッケージを作るように specファイルを書き換えます(~/rpmbuild/SPECS/rancid.spec)
差分は下記の通りです。不要な patch の適用などをコメント or 削除してしまいます。

--- rancid.spec.bak	2018-03-28 09:56:30.022287520 +0000
+++ rancid.spec	2018-05-22 10:46:48.702034697 +0000
@@ -1,6 +1,6 @@
 Name: rancid
-Version: 3.2
-Release: 2%{?dist}
+Version: 3.7
+Release: 1%{?dist}
 Summary: Really Awesome New Cisco confIg Differ

 Group: Applications/Internet
@@ -9,16 +9,7 @@
 Source0: ftp://ftp.shrubbery.net/pub/{name}/%{name}-%{version}.tar.gz
 Source1: %{name}.cron
 Source2: %{name}.logrotate
-Patch0: %{name}-conf.patch
 Patch1: %{name}-Makefile.patch
-# Upstream Patches
-Patch20: %{name}-%{version}.p1
-Patch21: %{name}-%{version}.p2
-Patch22: %{name}-%{version}.p3
-Patch23: %{name}-%{version}.p4
-Patch24: %{name}-%{version}.p5
-Patch25: %{name}-%{version}.p6
-Patch26: %{name}-%{version}.p7

 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

@@ -27,11 +18,11 @@
 BuildRequires: rsh
 BuildRequires: openssh-clients
 BuildRequires: expect >= 5.40
-BuildRequires: cvs
-BuildRequires: subversion
+#BuildRequires: cvs
+#BuildRequires: subversion
 BuildRequires: perl
 BuildRequires: iputils
-BuildRequires: sendmail
+#BuildRequires: sendmail

 Requires(pre): shadow-utils
 Requires: findutils
@@ -48,21 +39,14 @@

 %prep
 %setup -q -n %{name}-%{version}
-%patch0 -p1
 %patch1 -p1
-%patch20 -p0
-%patch21 -p0
-%patch22 -p0
-%patch23 -p0
-%patch24 -p0
-%patch25 -p0
-%patch26 -p0

 %build
 %configure \
     --sysconfdir=%{_sysconfdir}/%{name} \
     --bindir=%{_libexecdir}/%{name} \
     --libdir=%{perl_vendorlib} \
+    --with-git \
     --enable-conf-install
 make %{?_smp_mflags}

あとは

$ cd ~/rpmbuild/SPECS
$ rpmbuild -ba rancid.spec

でパッケージが出来上がるので、これをインストールします

$ sudo rpm -ivh ~/rpmbuild/RPMS/x86_64/rancid-debuginfo-3.7-1.el7.centos.x86_64.rpm

環境によってはさらに下記のパッケージのインストールが必要かもしれません。

$ sudo yum install perl-Sys-Syslog perl-MailTools perl-LockFile-Simple perl-CGI

Rancid の設定ファイルについて

Rancidの管理ファイルは基本的に

– /etc/rancid/rancid.conf

を編集します。人によっては

– /etc/rancid/rancid.types.base

を修正することがあるかもしれません。ここでは各種対応機種に応じて発行されるコマンドやその結果をどの関数でフィルタしてやるのかといった情報が集約されています。

arista;script;rancid -t arista
arista;login;clogin
arista;module;aeos
arista;inloop;aeos::inloop
arista;command;aeos::ShowVersion;show version
arista;command;aeos::ShowBoot;show boot-config
arista;command;aeos::ShowEnv;show env all
arista;command;aeos::ShowFlash;dir flash:
arista;command;aeos::ShowInventory;show inventory
arista;command;aeos::ShowBootExt;show boot-extensions
arista;command;aeos::ShowExt;show extensions
arista;command;aeos::DiffConfig;diff startup-config running-config
#arista;command;aeos::WriteRibd;show tech ribd running
arista;command;aeos::WriteTerm;show running-config

上記は rancid.types.base ファイル中のAsita機器の処理に関して記述されている箇所の抜粋です。login処理をどうするのか、module はどのモジュールを使って処理をするのか、また発行するコマンドとそれを処理する関数などを列挙しています。ただ、普段使うときはあまり意識することはないと思います。編集するにしても、運用を始めたあとに、必要・不必要に応じてコメントにするぐらいでしょうか。

使い始めるには rancid.conf内の

– BASEDIR
– CVSROOT (gitを使う場合でもあっても)
– LIST_OF_GROUPS

などを環境に合わせて修正することになりますが、詳細については次回解説していきます。

次回予告

今回は、rancid の概要とインストールするまでを説明させて頂きました。実際に動作環境を整えるには、rancid の管理対象となるネットワーク機器を用意する必要があります。最近はありがたいことに、仮想環境で動く仮想ルータも増えました。次回は、それら仮想ルータを起動し、rancid を一通り動かすところまでをご紹介したいと思います。

本ブログの情報につきましては、自社の検証に基づいた結果からの情報提供であり、
品質保証を目的としたものではございません。

投稿者: Koichi KUNITAKE

最近は Ansible やら Sphinx 触ってます。IPv6 はボチボチ……