oxidizedとgitlabでネットワーク機器のコンフィグ管理自動化検証

# はじめに
<!-- 発端や概要を記載 -->
oxidizedとgitlabでネットワーク機器のコンフィグ管理を自動化する検証の個人メモ。
ネットワーク機器をたくさん運用している現場に役立つかも。

今回の検証では、VagrantでvSRX、dockerでoxidizedとgitlabを立ち上げます。
vSRXのコンフィグをoxidizedで自動取得し、gitlabに保存することが目的です。

設定変更作業後にコンフィグを手動で取得して、そのファイルをUSBで社内NWに移して、共有フォルダに格納して構成管理する、、という無駄作業が少しでも減ればうれしいところ。

最新のコンフィグが適切と管理されていないと、故障等で機器交換するとき大変なので、ちゃんと自動化します。

# 環境
- mac OS Catalina 10.15.7
- docker 19.03.13
- docker-compose 1.27.4
- vagrant 2.2.10

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [docker準備](#docker準備)
1. [vSRX準備](#vSRX準備)
1. [gitlab準備](#gitlab準備)
1. [oxidized準備](#oxidized準備)
1. [実行](#実行)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# docker準備
docker周りの準備をします

## dockerインストール

[この記事](https://qiita.com/tomokei5634/items/7b1e7a121d5d7bc12116)を参考にdockerとdocker-composeをインストール

以下自分の環境

```terminal
# docker -v
Docker version 19.03.13, build 4484c46d9d
```

```terminal
$ docker-compose -v
docker-compose version 1.27.4, build 40524192
```

## dockerが利用できるメモリ上限を引き上げる

Mac版dockerはデフォルトでメモリが2GBまでしか使えないので、[この記事](https://blog.pinkumohikan.com/entry/increase-memory-limit-of-docker-for-mac)を参考にいい感じに増やしておく。メモリ4G/スワップ1Gくらい?マシンスペックと相談。

これを怠ると、後でgitlabに502エラーを一生突きつけられて心折れます。
gitlabがやたらメモリ使うので注意！

<a id="#Chapter2"></a>
# vSRX準備
今回は、ネットワーク機器を模擬するのにVagrant+vSRXを使います。

## vagrantとvirtual boxをインストール

[この記事](https://qiita.com/syo19961113/items/1b0439b9d123032f7892)を参考にvagrantとvirtual boxをインストール

以下自分の環境

```terminal
$ vagrant -v
Vagrant 2.2.10
```

## vagrantのプラグインをインストール
vSRXを動かすのにプラグインが必要?なので無心で入れていきます。

```terminal
$ vagrant plugin install vagrant-host-shell
$ vagrant plugin install vagrant-junos
```

以下自分の環境

```terminal
$ vagrant plugin list
vagrant-host-shell (0.0.4, global)
vagrant-junos (0.2.1, global)
```

## vSRX立ち上げ
太古のvSRXをvagrant上で起動します。packetmode(ルータ)のvSRXを使ってください。
間違えてflowmode(FireWall)のvSRXを使うと、pingで一生複製(DUP)されて返ってきて気が狂います。

```terminal
# ディレクトリ作成
$ mkdir vSRX

# ディレクトリに移動
$ cd vSRX

# vSRXのVagrantfileを作る
$ vagrant init juniper/ffp-12.1X47-D15.4-packetmode

# vSRXのIPを適当に設定。今回は192.168.33.10
$ sed -i '' -e 's/# config.vm.network "private_network", ip: "192.168.33.10"/config.vm.network "private_network", ip: "192.168.33.10"/' Vagrantfile

# vSRXを起動 気長に待つ 結構時間かかる
$ vagrant up

# ステータス確認 runningになっていればOK
$ vagrant status
Current machine states:

default                   running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.

```

## vSRXユーザ作成
後で使うので、oxidized用にユーザを作ります。
前の項目と同じディレクトリで作業。
ユーザとパスワードは後で使います。

```terminal
# vSRXにsshログイン
$ vagrant ssh
--- JUNOS 12.1X47-D15.4 built 2014-11-12 02:13:59 UTC
root@vsrx%

# vSRX cliモードに移行
root@vsrx% cli
root@vsrx> 

# vSRX configureモードに移行
root@vsrx> configure
root@vsrx#

# oxidizedのユーザを追加
root@vsrx# set system login user oxidized class super-user
root@vsrx# set system login user oxidized authentication plain-text-password
New password:[好きなパスワード入れてエンター]
Retype new password:[もう一回入れてエンター]

# 設定をcommitする
root@vsrx# commit

# exitを数回やってvSRXから抜ける
# ssh oxidized@192.168.33.10 とかでsshできるのを確認するのもあり
# ssh時、WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!がでたらknow_hostsから192.168.33.10を消してみる
```

<a id="#Chapter3"></a>
# gitlab準備
dockerでgitlabを立てていきます。

## docker-compose.yaml作成
gitlabのdocker-composeファイルを作ります。

```terminal
# ディレクトリ作成
$ mkdir gitlab

# ディレクトリに移動
$ cd gitlab

# docker-compose.yamlファイル作成
$ touch docker-compose.yaml
```

docker-compose.yamlを以下に編集します。

```yaml:gitlab/docker-compose.yaml
version: '3.8'
services:
  gitLab:
    image: gitlab/gitlab-ce:latest
    ports:
     - "10080:80"
    volumes:
     - './config:/etc/gitlab'
     - './logs:/var/log/gitlab'
     - './data:/var/opt/gitlab'
```

## gitlab実行

`docker-compose up`で実行していく

```
$ docker-compose up -d
```

`docker-compose up`自体は早いですが、
プラウザで見れるようになるまで、気長に待ちます。結構時間かかります。
立ち上げが完了するまでは、woops!とか502とかエラーが表示されて悲しい気持ちになります。待ちましょう。

## gitlabアクセス
http\://localhost:10080 にブラウザアクセス

![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794711/5829cf59-b38b-a525-7c70-a7f298aa2b93.png)


画面に従って、rootのパスワードを初期設定してください。

## gitlab oxidizedユーザ作成
oxidizedが使うユーザを作ります。

http\://localhost:10080 にブラウザアクセス

![fig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794711/d4f012a6-8b07-ae7e-fb0a-7a05302cd109.png)


oxidizedのユーザを作成して、画面通り進んでいきます。

## gitlab リポジトリ作成
oxidizedで使うプライベートリポジトリを作ります。今回は以下の名前で。
Project name: config-auto-collector

![fig3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794711/3cccfe9f-2790-812b-ea2d-bdabe7b984a7.png)

リポジトリの作成が完了しました。

![fig4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794711/d6382644-fb99-be46-4d74-a79bc4e4f2e5.png)

<a id="#Chapter4"></a>
# oxidized準備
oxidized周りの準備をします

## docker-compose.yaml作成
oxidizedのdocker-composeファイルを作ります。

```terminal
# ディレクトリ作成
$ mkdir oxidized

# oxidized/に移動
$ cd oxidized

# docker-compose.yamlファイル作成
$ touch docker-compose.yaml
```

docker-compose.yamlを以下に編集します。
`extra_hosts`の存在知らなくて2日寝込みました
dockerコンテナにhostsを自動設定してくれるので、便利

```yaml:oxidized/docker-compose.yaml
oxidized:
  restart: always
  image: oxidized/oxidized:latest
  ports:
    - 8888:8888/tcp
  environment:
    CONFIG_RELOAD_INTERVAL: 600
  volumes:
    - ./oxidized:/root/.config/oxidized
  extra_hosts:
    - vSRX:192.168.33.10
```

## oxidizedの設定(config)
oxidizedのconfig設定をしていきます。

```terminal
# もいっこディレクトリ作成
$ mkdir oxidized

# oxidized/oxidized/に移動
$ cd oxidized

# configファイル作成
$ touch config
```

configを以下に編集します。
不要な設定がある気もしますが、信じてコピペします。
一部IPやパスワードは自分の環境のものを入れてください。
取得間隔(interval)が10秒になっているので、本番環境に入れるときは要チューニング。
(半日、1日位毎くらいでもいいかも)

```yaml:oxidized/coxidized/config
---
username: oxidized
password: oxidized
model: junos
resolve_dns: true
interval: 10
use_syslog: false
log: "/root/.config/oxidized/logs/oxidized.log"
debug: false
threads: 30
timeout: 20
retries: 3
prompt: !ruby/regexp /^([\w.@-]+[#>]\s?)$/
rest: 127.0.0.1:8888
next_adds_job: false
vars: {}
groups: {}
models: {}
pid: "/root/.config/oxidized/pid"
crash:
  directory: "/root/.config/oxidized/crashes"
  hostnames: false
stats:
  history_size: 10
input:
  default: ssh, telnet
  debug: false
  ssh:
    secure: false
  ftp:
    passive: true
  utf8_encoded: true
output:
  default: git
  git:
      user: oxidized
      email: [gitlabでoxidizedアカを作るときに指定したメールアドレス]
      single_repo: true
      repo: "/root/.config/oxidized/config-auto-collector"
hooks:
  push_to_remote:
    type: githubrepo
    events: [post_store]
    remote_repo: "http://[ローカルホストの実IP]:10080/oxidized/config-auto-collector.git"
    username: oxidized
    password: [gitlabのパスワード]
source:
  default: csv
  csv:
    file: "/root/.config/oxidized/router.db"
    delimiter: !ruby/regexp /:/
    map:
      name: 0
      model: 1
      username: 2
      password: 3
    vars_map:
      enable: 4
model_map:
  cisco: ios
  juniper: junos
```

## oxidizedの設定(router.db)
oxidizedのrouter.db設定をしていきます。
oxidizedで取得対象となるネットワーク機器を設定する感じです。

```terminal

# oxidized/oxidized/配下で作業
# router.dbファイル作成
$ touch router.db
```

router.dbを以下に編集します。

```yaml:oxidized/coxidized/router.db
vSRX:juniper:oxidized:[vSRXのoxidizedユーザのパスワード]
```

## リポジトリ準備
せっかく作ったリポジトリをcloneしておきましょう。
localhostなどは使わずに、必ず実IPでアクセスしてください。
このリポジトリは、dockerコンテナと共有されるファイルですので、
localhostにしておくとdockerコンテナ側から簡単にアクセスできなくなります。(たぶん)

```terminal
# oxidized/oxidized/配下で作業
$ git clone http://oxidized@[ローカルホストの実IP]:10080/oxidized/config-auto-collector.git
```

<a id="#Chapter5"></a>
# 実行
やっとoxidized実行。
gitlab、vSRXが立ち上がっている状態で実行します。

## oxidized起動

```terminal
# oxidized/配下で作業
$ docker-compose up -d
```

うまくいくと勝手にリポジトリにvSRXのコンフィグが入ってきます。
もちろん、vSRXのconfigを変更すると、自動でリポジトリにpushされます。
めでたしめでたし。

![fig5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794711/e71fde7d-d02c-0b9c-2d02-cb1e79a37aaa.png)


後は細かなチューニングやホスト登録とかして、本番環境にデプロイしましょう。


# Tips

## vagrantが固まったとき

`ps -ef|grep VBox`で出てきたpidをkillしましょう。
vSRXがよく固まる印象

## dockerコンテナに入る
『docker 入る』と2万回くらいググりました。覚えましょう

```terminal
$ docker-compose exec [container名] bash
```

# TODO
- ファイル名がホスト名になっちゃうのどうにかしたい
- 出力されるconfigファイルに、実行コマンドが表示されないのなんとかしたい
- 自作modelで取得情報を拡張させたい(show int terseとか)
- 実環境で試す
- ホストの扱いいい方法ないもんかなあ、、対象ホストが多くなると、手打ち辛い

# 感想
- oxidizedはドキュメント少なくて辛い
- インターネットにでれる環境であれば、わざわざローカルにgitlab立てなくてOK
- 一回デプロイしてしまえばあとは楽ちん運用できそう
- cvsのUIがダサいので、gitlabを使ってみたけど、単純にコンフィグファイルの世代管理だけならcvsのほうが見やすい気がする
- gitlabの機能を持て余している感ある。なんか面白いことできないかなあ
- gitlabリソース使いすぎ、仮想環境じゃないほうがいいのかも
- gitはそもそもネットワーク運用メンバーに馴染みがないから、あんま使わないほうが良いかも
- vSRX、plain-text-passwordでユーザ作ってもコンフィグみるとencryptedになっているんだがなんでじゃ？そういうもの？


おわり