Help us understand the problem. What is going on with this article?

githubでネットワーク機器のコンフィグを管理したらこんな感じ

More than 3 years have passed since last update.

はじめに

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の番号を含めることで差分とレビューをひも付けます。

https://github.com/junpei-yoshino/sample-nw-config/commit/4d2f3df3207c70f92abeb2f94ccf35718dc3d476

これをやると便利なこと

例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使ってコンフィグ管理するといろいろ便利なことがあることを紹介しました。
既存で履歴変更の管理ツールはあっても、変更予定内容のレビュー等まではできなかったと思います。

ネットワーク機器の設定を自動で変えているわけではないですが、この周辺にはいろいろな開発余地が残されているのではないでしょうか。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした