DCIMツール netboxをCentOS8にインストールする

# Netboxってなに
DigitalOceanのネットワークエンジニアリングチームが作ったOSSのDCIM(Data Center Infrastructure Management)ツールです。

サイトのドキュメントは英語ですが以下からどうぞ
https://netbox.readthedocs.io/en/stable/

ドキュメントから抜粋して軽く日本語で書くとこんな感じです。

|項目|どんなことができるのか|
|:--|:--|
|IP address management (IPAM)|IPアドレス、サブネット、VLAN、VRF管理|
|Equiqment racks|組織、グループ、サイト単位でのラック管理|
|Devices|デバイスの種類やそれらに導入されたもの|
|Connections|ネットワーク、コンソール、電源などの接続しているものの管理|
|Virtualization|仮想マシンおよびクラスタの管理|
|Data circuits|プロバイダなどの回線管理|
|Secrets|認証情報の管理|

## 何が便利か
何ができるか、で書かれたことを1個のエクセルファイルとかで管理するのは難しく、
ドキュメントがバラバラになり、管理が煩雑になりがちです。
これらが1つのWebアプリケーションとなり、包括管理できることがすばらしく、
APIインターフェースを持っていることでAnsibleをつかってネットワークを巡回して自動的に登録したりなんていうことも、
使い方次第でできるようになります。

# インストール編

今回は1VMで全部インストールする方法です。
[docker-compose](https://github.com/netbox-community/netbox-docker)もあるみたいなので後日試してみたいと思います、。

## SELinux

~~つかえません~~つかいません。

本来はSELinuxを有効にしましょう。と言いたいところですが、
SELinux周りで躓くくらいなら先に動かしてヒャッホイしたいということでスキップします。
いわゆる技量不足のため麺硬めはできません。ってやつです。美味しく食べてください。
（社内公開用だからあれだけど、外部公開する時はメリデメ見極めて採用可否を判断してくださいね。）

## PostgreSQL install
PostgreSQLをインストールします。
単純にDBMSとしてデータを保管しているだけなので、別サーバーでもできますね。
pg_hba.confの修正もわすれずに。

```
[root@netbox ~]# dnf -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
[root@netbox ~]# dnf -qy module disable postgresql
[root@netbox ~]# dnf -y install postgresql12-server
[root@netbox ~]# /usr/pgsql-12/bin/postgresql-12-setup initdb
[root@netbox ~]# systemctl enable postgresql-12
[root@netbox ~]# systemctl start postgresql-12
[root@netbox ~]# su - postgres
[postgres@netbox ~]$ psql
psql (12.3)
"help"でヘルプを表示します。

postgres=# alter user postgres with password 'hogehoge';
ALTER ROLE
postgres=# create database netbox;
CREATE DATABASE
postgres=# create user netbox with password 'hogehoge';
CREATE ROLE
postgres=#  GRANT ALL PRIVILEGES ON DATABASE netbox TO netbox;
GRANT
postgres=# \q
[postgres@netbox ~]$ cd 12/data/
[postgres@netbox data]$ cp -p pg_hba.conf{,.bak}
[postgres@netbox data]$ vi pg_hba.conf
[postgres@netbox data]$ diff pg_hba.conf{,.bak}
82c82
< host    all             all             127.0.0.1/32            md5
---
> host    all             all             127.0.0.1/32            ident
84c84
< host    all             all             ::1/128                 md5
---
> host    all             all             ::1/128                 ident

[root@netbox ~]# systemctl restart postgresql-12
[root@netbox ~]# systemctl status postgresql-12
```

## redis install
インメモリデータストアでredisを使用しています。

```
[root@netbox ~]# dnf -y install epel-release
[root@netbox ~]# systemctl start redis
[root@netbox ~]# systemctl enable redis
[root@netbox ~]# dnf install -y redis
```

## netbox install

いよいよnetboxインストールです。
venvの定義が付属しているので、思ったよりかんたんに導入できます。

```
[root@netbox ~]# dnf install -y gcc python36 python36-devel libxml2-devel libxslt-devel libffi-devel openssl-devel redhat-rpm-config git
[root@netbox netbox]#  git clone -b master https://github.com/netbox-community/netbox.git .
[root@netbox netbox]# groupadd --system netbox
[root@netbox netbox]# adduser --system --gid netbox netbox
[root@netbox netbox]# chown --recursive netbox /opt/netbox/netbox/media/
[root@netbox netbox]# python3 -m venv /opt/netbox/venv
[root@netbox netbox]# source venv/bin/activate
(venv) [root@netbox netbox]# pip3 install -r requirements.txt
(venv) [root@netbox netbox]# pip3 install napalm
(venv) [root@netbox netbox]# echo napalm >> local_requirements.txt
(venv) [root@netbox netbox]# pip3 install django-storages
(venv) [root@netbox netbox]# echo django-storages >> local_requirements.txt
(venv) [root@netbox netbox]# cd netbox/netbox/
(venv) [root@netbox netbox]# cp configuration.example.py configuration.py
(venv) [root@netbox netbox]# python ../generate_secret_key.py
ここの結果をSECRET_KEYに貼り付ける
(venv) [root@netbox netbox]# vi configuration.py

(venv) [root@netbox netbox]# cd /opt/netbox/netbox/
(venv) [root@netbox netbox]#  python3 manage.py migrate
```
## ログイン用のスーパーユーザーの作成
```
(venv) [root@netbox netbox]# python3 manage.py createsuperuser
Username (leave blank to use 'root'): phadmin
Email address: hogehoge@hogehoge.jp
Password:
Password (again):
Superuser created successfully.
```

## お試しで起動してみましょう

curlで見る限りもnetboxの画面が出力されてるように見えるので、一旦はOKとしました。
心配な場合はブラウザから見てみてください。

```
(venv) [root@netbox netbox]# python3 manage.py collectstatic --no-input

976 static files copied to '/opt/netbox/netbox/static'.
(venv) [root@netbox netbox]#  python3 manage.py runserver 0.0.0.0:8000 --insecure
Performing system checks...

System check identified no issues (0 silenced).
July 27, 2020 - 02:17:42
Django version 3.0.8, using settings 'netbox.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
[27/Jul/2020 02:18:14] "GET / HTTP/1.1" 200 31272

[root@netbox ~]# curl http://192.168.200.118:8000/


<!DOCTYPE html>
<html lang="en">
<head>
    <title>Home - NetBox</title>
    <link rel="stylesheet"
～省略～


```

## apache install
普通に80版からアクセスしたいので、apacheを使って連携しました。
もちろんnginxでも連携できます。

firewalldのポート開放も忘れずに。

```
[root@netbox ~]# dnf install -y httpd
[root@netbox ~]# cp /opt/netbox/contrib/apache.conf /etc/httpd/conf.d/netbox.conf
[root@netbox ~]# vi /etc/httpd/conf.d/netbox.conf
[root@netbox ~]# diff /opt/netbox/contrib/apache.conf /etc/httpd/conf.d/netbox.conf
1c1
< <VirtualHost *:443>
---
> <VirtualHost *:80>
5,9c5
<     ServerName netbox.example.com
<
<     SSLEngine on
<     SSLCertificateFile /etc/ssl/certs/netbox.crt
<     SSLCertificateKeyFile /etc/ssl/private/netbox.key
---
>     ServerName netbox.hogehoge.jp
[root@netbox ~]# systemctl enable httpd --now
[root@netbox ~]# firewall-cmd --add-service=http --permanent
[root@netbox ~]# firewall-cmd --reload
```

## 自動起動・デーモン化

自動起動用にsystemdのserviceファイルが用意されているので忘れずに登録しましょう。

```
[root@netbox ~]# cd /opt/netbox
[root@netbox netbox]# cp contrib/gunicorn.py /opt/netbox/gunicorn.py
[root@netbox netbox]# cp contrib/*.service /etc/systemd/system/
[root@netbox netbox]# systemctl daemon-reload
[root@netbox netbox]# systemctl start netbox netbox-rq
[root@netbox netbox]# systemctl enable netbox netbox-rq
Created symlink /etc/systemd/system/multi-user.target.wants/netbox.service → /etc/systemd/system/netbox.service.
Created symlink /etc/systemd/system/multi-user.target.wants/netbox-rq.service → /etc/systemd/system/netbox-rq.service.
[root@netbox netbox]# systemctl status netbox.service
● netbox.service - NetBox WSGI Service
   Loaded: loaded (/etc/systemd/system/netbox.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-07-27 11:26:20 JST; 11s ago
     Docs: https://netbox.readthedocs.io/en/stable/
 Main PID: 90125 (gunicorn)
    Tasks: 6 (limit: 49284)
   Memory: 299.2M
   CGroup: /system.slice/netbox.service
           tq90125 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/netbox --config /opt/netbox/gunicorn.py netbox.wsgi
           tq90132 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/netbox --config /opt/netbox/gunicorn.py netbox.wsgi
           tq90133 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/netbox --config /opt/netbox/gunicorn.py netbox.wsgi
           tq90136 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/netbox --config /opt/netbox/gunicorn.py netbox.wsgi
           tq90138 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/netbox --config /opt/netbox/gunicorn.py netbox.wsgi
           mq90139 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/netbox --config /opt/netbox/gunicorn.py netbox.wsgi

 7月 27 11:26:20 netbox.dev.pumpkinheads.jp systemd[1]: Started NetBox WSGI Service.
 7月 27 11:26:20 netbox.dev.pumpkinheads.jp gunicorn[90125]: [2020-07-27 11:26:20 +0900] [90125] [INFO] Starting gunicorn 20.0.4
 7月 27 11:26:20 netbox.dev.pumpkinheads.jp gunicorn[90125]: [2020-07-27 11:26:20 +0900] [90125] [INFO] Listening at: http://127.0.0.1:8001 (90125)
 7月 27 11:26:20 netbox.dev.pumpkinheads.jp gunicorn[90125]: [2020-07-27 11:26:20 +0900] [90125] [INFO] Using worker: threads
 7月 27 11:26:20 netbox.dev.pumpkinheads.jp gunicorn[90125]: [2020-07-27 11:26:20 +0900] [90132] [INFO] Booting worker with pid: 90132
 7月 27 11:26:20 netbox.dev.pumpkinheads.jp gunicorn[90125]: [2020-07-27 11:26:20 +0900] [90133] [INFO] Booting worker with pid: 90133
 7月 27 11:26:20 netbox.dev.pumpkinheads.jp gunicorn[90125]: [2020-07-27 11:26:20 +0900] [90136] [INFO] Booting worker with pid: 90136
 7月 27 11:26:20 netbox.dev.pumpkinheads.jp gunicorn[90125]: [2020-07-27 11:26:20 +0900] [90138] [INFO] Booting worker with pid: 90138
 7月 27 11:26:20 netbox.dev.pumpkinheads.jp gunicorn[90125]: [2020-07-27 11:26:20 +0900] [90139] [INFO] Booting worker with pid: 90139

```
これでセットアップ完了です。

## ブラウザからアクセスする
以下のような画面が表示されたら完了です。
右上のログインから先程登録したユーザーでログインしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126158/1aecacfe-af88-02e6-f1c1-20bbd5c4ac64.png)

## おまけ: IPアドレスディスカバリ

思った動きにはなっていないので、実行したログだけ公開。
nmapがいい感じにIPアドレス巡回してホスト名を拾ってくれるはずなのですが、
現時点ではうまく行かず、"autodiscovered:netbox-scanner"とDescription項目に入った情報がIP Address管理画面に表示されるという感じです。

ansible連携してインベントリ登録する方法などを紹介されているところもあるので、
今後試してみて見たいと思います

```
[root@netbox ~]# source /opt/netbox/venv/bin/activate
(venv) [root@netbox ~]# dnf install -y nmap
(venv) [root@netbox ~]# wget https://github.com/lopes/netbox-scanner/archive/v2.zip
(venv) [root@netbox ~]# unzip v2.zip
(venv) [root@netbox ~]# cd netbox-scanner-2
(venv) [root@netbox netbox-scanner-master]# pip install -r requirements.txt
(venv) [root@netbox netbox-scanner-master]# cp netbox-scanner.conf /opt/netbox/netbox-scanner.conf
(venv) [root@netbox netbox-scanner-master]# vi /opt/netbox/netbox-scanner.conf
(venv) [root@netbox netbox-scanner-2]# diff netbox-scanner.conf /opt/netbox/netbox-scanner.conf
2,3c2,3
< address    = https://netbox.domain
< token      =
---
> address    = http://netbox.dev.pumpkinheads.jp
> token      = {APITOKEN}
8c8
< path     = samples/nmap
---
> path     = nmap
12a13,21
> [NETXMS]
> address    = https://netxms.domain
> username   =
> password   =
> tls_verify = no
> unknown    = autodiscovered:netbox-scanner
> tag        = netxms
> cleanup    = yes
>
(venv) [root@netbox netbox-scanner-2]# mkdir nmap
(venv) [root@netbox netbox-scanner-2]# nmap -T4 -O -F --host-timeout 30s -oX nmap/nmap-192.168.200.0.xml -sS 192.168.200.0/24
(venv) [root@netbox nmap]# cd ..
```

# さいごに
道具としてすごく便利ですが、ルールぎめをしつつメンテナンスをしていかないと
結局エクセルでやってた時と同じです。
ただ細かくデータ投入することに気を取られていると、それだけで気疲れするというものもあるので、
少しずつ適用範囲を広げてはどうでしょうか。

電源管理とかも1個1個のデバイスの使用電力量をコツコツ入れていくと見えるかできたり、
データセンター移設やラックごと引き継ぎもかんたんにできるようになると思います。
デバイスをテンプレート化していくことができるので、ある程度まとまって同等機種を入れているようなラックには
登録が比較的ラクに行う事ができるとおもいます。

実験的に導入している段階ですが、スマホからでも気軽に見えるようにVPN経由で見られるようにして利用しています。