ろーてくxyz blog

ローテクを駆使してIT関係でサヴァイヴしようとする人による備忘録

Gitlabを使ってNW機器のconfig管理した時の話

PowerDNSの続きを記事にしようとしていたのだが、
使っていたPublic Cloudが IDCFさんで個人での契約が終了との事で契約が終了する前にデータの取得が間に合わず・・・
やろうやろうと思ってもう7月。

今回はGit(Gitlab)を使ってNW機器のconfig管理をやったりしていた内容をメモに残したいと思います。
GitlabのMeet UpのLTでお話して同じような事をしている人と交流を持ったらとかも思ったりしましたが、少しニッチなネタな気もしたり、タイミングが合わなかったので独り言blogに残してみようと思います。

数年前に環境影響なども考慮せざる得ず、なんとも言えない手法でC社さんやA社さんの機器configを無理やり取得するツールを書いたりしていましたが

rotek.hateblo.jp

それの続編みたいな感じで私個人的な所感も合わせてメモしておこうと思います。

なぜGitlabで

  • ツールやAnsible類のコード管理にGitlab使い始めていた
    (個人的に使いたかったので検証の名目で手持ちのシステムに導入などをしていた)
  • そんな時NW機器のconfig管理状態が良くなかったので使ってみる事に
    • お決まりのconfig-YYYYMMDDXX.txtでどれが最新なのかわからない状態
    • いつ誰が何故変更を加えたのかもわからない
      (厳密に言うと作業履歴からは追えるけど)
    • 保存場所が人や案件によりバラバラの事がある
    • 開発者や運用者などでの重複管理問題
    • 設定変更計画時にrunning-configをテキストコピペで取得する苦労

Gitlabを使わなくても?

Gitlabのようなものでは無くとも、ネットワーク機器コンフィグ管理に特化した以下のようなSoftwareもあったりするようです。

  • RANCID (バックエンドにGitを使えるらしい?)
  • Oxidized (バックエンドにGitを使えるらしい??)

などなど

実際に導入した事がないので何とも言えないのですが、この辺は有名NW機器メーカに対応しており取得から管理までを行う事ができるようです。
他にも先日のInterop Tokyoで見かけたのですが商用ソフトなどもあるようです。

先人のみなさまの情報

重要な先人の方々の情報も忘れてはいけない
始めようと思ったので他にやっている方がいるのかをまずは調べてみました。
(私が最初に取り掛かったのは2017年頃のお話)

ルーターのコンフィグを git にぶち込んで世代管理してみたはなし
@miyahan さん
https://miyalog.hatenablog.jp/entry/2016/06/01/105515

githubでネットワーク機器のコンフィグを管理したらこんな感じ
@junpei-yoshino さん
https://qiita.com/junpei-yoshino/items/bf223677f332d3e833c4

他にもぼちぼち日本語記事がヒット。当然既に使われている方多かった!!

実際にGitを使って私がやってみた事

やってい(た|る)事

  • configを取得してdailyでcommitからpushまで
  • 作業実施後に手動でcommit
  • 特定commit時のconfigへの切り戻し

configを取得してdailyでcommitからpushまで

ツールはサーバも古かったり諸事情により自分Python書きで作成
といってもほぼExpectな処理 (tftp等ではなく諸事情で所謂show run系で取得)
本記事の冒頭にも書いた以前の記事のスクリプト内容を改変して使用
基本的には作業時に手動でこのスクリプトを叩くなりしているはずだけど、push忘れや障害時でオペレータが閉塞の対応等をした時に気付ける通知を出せるようにcronで回す。
なお、branch管理はせずにmasterにpushする男らしい仕様。

作業実施後に手動でcommit

基本的には前に書いた取得からpushまでするスクリプトを最後に流せばOKではあるが、細かい単位でcommitをかけていた事もあった。
ただcommitをかけるタイミング、区切りが難しいので、結局のところ作業終了後にスクリプトを回すだけに落ち着く。

特定commit時のconfigへの切り戻し

git logからcommitのhashを確認してgit showやgit diffで取り出しや差分比較をするとかのやり方

  • 特定commitのファイルを取り出す(標準出力)
    $ git show [hash]:[path/file]

  • 特定commitのファイルを取り出す(ファイルを取り出し)
    $ git checkout [hash] -- [file]

  • 特定のcommitのファイルと現在のファイルのdiff
    $ git diff [hash] -- [file]

などなど。
少し覚える必要ありですが、取り出しやdiffもやりやすいのかも。

やってみての感想・課題とか

  • 管理自体は集中されるのでツール類とかを管理しているついでにサーバ屋な人が軽く使うには良いと思う

  • Gitが使われていない環境だとGit自体の学習コストが高すぎて結局自分しか使わない説もある
    (cronで回しておけばみんな使わなくても勝手に管理はされる。はず。)

  • Webhookとか使うと、知らぬ間に作業がされたりオペレータが障害対応で変更加えた等がdailyで通知されるので嬉しい

  • Issue管理を使ってチーム内でのレビューとかをしたい
    (その前にチームにGitlabを浸透させる必要・・・・)

  • Git Flowを使ったMRを使った作業前のレビューの導入
    (その前にチームにGitlabを浸透させる必要・・・・・・・・)

  • 検証configをpush後に投入用configの自動生成をしたらスマート?

最近はNW屋さんなんかも自動化など注力されている方もいますし、まずは手元にあるGitlab等を活用してはいかかでしょうか。