はじめに
NetOpsCoding Advent Calendar 2015の25日目のエントリーです。
gitを使ってネットワーク構成変更をバリバリやる運用の話をします。
今回はgithubを使った場合を想定して紹介します。
あくまでも例なので、さらに良い方法があると思います。
どんなことするの?
Github Flowを実践します。
今回の記事ではPull Requestをマージしていません。
これは後で、現状の問題点を記載しようと思います。
具体的には、以下の流れでネットワーク機器を変更します。
- 構成を変更する時に、branchを作って完成系のコンフィグを作りcommitし、pushする
- 差分から作業用コマンドを生成する
- 実際にネットワーク機器に設定する
- masterに最新のコンフィグを保管する
例があった方がわかりやすいと思うので、説明用のリポジトリを作りました。
自作自演しているので、複数の人がいるだろうと思って見ていただけると嬉しいです。
https://github.com/junpei-yoshino/sample-nw-config
インターフェイスの設定を変える差分の例
レビューフェーズ
インターフェイスのデスクリプションをつける変更を試しに例としてやってみました
https://github.com/junpei-yoshino/sample-nw-config/pull/1
変更内容に対して、コメントをつけて意味の確認等をします。
関係者が合意できたところで、レビュー終了です。
作業フェーズ
sample-nw-config junpei.yoshino$ git branch
* add-interface-description
master
sample-nw-config junpei.yoshino$ git diff 3fabf287f8a781766a7c423449ddd24b85fe5a66 | grep "^+set" | cut -c 2-
set interfaces xe-0/0/0 description hogehoge
sample-nw-config junpei.yoshino$ git diff 3fabf287f8a781766a7c423449ddd24b85fe5a66 | grep "^-set" | sed -e "s/^-set/delete/g"
sample-nw-config junpei.yoshino$
ざっくりこれで入力すべき内容は出力できます。
すごく便利!
ただ、問題もあります。
以下のどちらもJunoserでの解析結果を活用する等で解決できると思っていますが、真面目には取り組めていません。
commitする前に事前のレビューの結果と差を確認するには以下のコマンドを実施すると良いです。コンフィグモードでのコマンド例です。
show | display set | save ftp://hogehoge/fugafuga
これでレビューの完成形とdiffを取れば、設定漏れや以下の問題を確認できます。
順序に意味があるもの
diffで追加された行しか表示できないため問題があります。
たとえば、firewall filter等のterm追加は上の手順では作れません。
簡単な内容ならinsertコマンドを作成し、
適切なdeleteの実行
set a b c d
に対して、
delete a b c d
を実行した結果
set a b c
という結果になる場合があります。
set a b
としたかった場合に問題になります。これは文法依存なので、もうちょっと頭良くdeleteコマンドを生成する必要があります。
マージ方法
Pull Requestをマージしたいところですが、実機に反映されたコマンドの順序とレビュー時の順序が違う場合があります。
実機に入っているもののコンフィグ保存の側面もあるので、Pull Requestをマージではなく、masterに直接、実機から取ったコンフィグを入れてpushします。
コミットメッセージにはPull Requestの番号を含めることで差分とレビューをひも付けます。
これをやると便利なこと
例1: git grepで大体わかる
これなんのIPだっけとなったときに、以下のコマンドで、どこのどのインターフェイスについているアドレスかわかる。
git grep 2001:0DB8::1
これでIP表も捨てられます!
例2: junoserの活用
junoserはジュニパーネットワークスのJUNOSのコンフィグのPEGパーサーで、コンフィグのtypo等を発見してくれるツールです。
https://github.com/codeout/junoser
gitのフック機能を使って、変更したファイルをcommitする前に勝手にjunoserでチェックしてリポジトリにミスのあるコンフィグを送る前にチェックができるようにできます。
https://github.com/junpei-yoshino/sample-nw-config/blob/master/script/git-hook/pre-commit
一例をリポジトリに入れたので、これを.git/hooks/に置くことでチェックできるようになります。
問題ないコンフィグでもInvalidと警告が出た場合には、junoserにissue報告をお願いいたします。
まとめ
github使ってコンフィグ管理するといろいろ便利なことがあることを紹介しました。
既存で履歴変更の管理ツールはあっても、変更予定内容のレビュー等まではできなかったと思います。
ネットワーク機器の設定を自動で変えているわけではないですが、この周辺にはいろいろな開発余地が残されているのではないでしょうか。