はじめに
proxmoxを利用してVMを立て始めて早数年。そろそろIPアドレスの管理をスプレッドシートからちょっとカッコイイなにかに変えてみたいと思い始めました。
netboxというOSSを発見したので、導入した際のメモをここに残しておきます。
公式のインストールガイドをなぞっていけば問題なくインストールできると思います。
記事を最後まで書いた後、qiitaに同様の記事がないか再確認したところ、先駆者様がいらっしゃいました。
記事のレベルもこちらのほうが高いと思います。
せっかく書いたのでこの記事はこのまま公開します。
今後は記事を書き始める前に確認します・・・。
環境
構築時の環境を下記に記します。
個人的な好みでdiskを3つ用意しています。
万が一アプリケーションやDBがディスクを使い切ったときに、OSの起動やSSHでの接続ができるようにするためです。
後述しますが、お家ラボ程度あればdisk2,3は2Gでも十分でした。
項目 | 内容 |
---|---|
OS | Ubuntu 24.04 |
ram | 8G (もっと少なくても行けたと思います) |
disk1 | 16G (bootなどに使用) |
disk2 | 16G (/opt netboxのアプリケーション本体用) |
disk3 | 32G (/var/lib postgresqlのデータ用 |
その他 | proxmos上にVMを構築 qemu-gaを導入しています |
アプリケーションの情報
項目 | 内容 |
---|---|
netbox | NetBox Community v4.1.6 |
python | Python 3.12.3 |
postgresql | psql (PostgreSQL) 16.4 |
Redis | v=7.0.15 |
nginx | nginx/1.24.0 |
構築手順
0. 初期設定
いつものおまじない
sudo apt update && sudo apt upgrade -y
sudo apt install qemu-guest-agent
1. PostgreSQLのインストール
PosetgreSQL 12以降が必要になります。
MySQLやその他のDBはサポート外のようです。
インストールとDBのバージョンの表示。
sudo apt install -y postgresql && psql -V
最終行に下記のような表示が出ればOK
バージョンが12以上であることを確認すること。
psql (PostgreSQL) 16.4 (Ubuntu 16.4-0ubuntu0.24.04.2)
このままDBにnetbox用のユーザーとテーブルを作成します。
下記のコマンドでpostgresのシェルに入ります。
sudo -u postgres psql
下記のコマンドを実行し、最後に\q
で抜けます。
DB用のパスワードは各自で決定、書き換えてください。
CREATE DATABASE netbox;
CREATE USER netbox WITH PASSWORD 'DB用のパスワードを記載';
ALTER DATABASE netbox OWNER TO netbox;
\connect netbox;
GRANT CREATE ON SCHEMA public TO netbox;
\q
最後にDBの状態を確認します。
下記のコマンドでpostgresのシェルに入ります。
パスワードを求められますので、先ほど設定したパスワードを入力してください。
psql --username netbox --password --host localhost netbox
問題がなければ下記のように表示されます。
psql (16.4 (Ubuntu 16.4-0ubuntu0.24.04.2))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.netbox=>
このままインフォメーションを表示します。
\conninfo
You are connected to database "netbox" as user "netbox" on host "localhost" (address "127.0.0.1") at port "5432".
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
確認ができたら\q
で抜けてください。
02.Redisのインストール
Redis 4.0以降が必要になります。
インストールとバージョンの表示
sudo apt install -y redis-serve && redis-server -v
最終行にバージョンが表示されればOK
Redis server v=7.0.15 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64 build=d81b8ff71cfb150e
最後にサービスの状態を確認します。
redis-cli ping
PONG
03. NetBoxのインストール
NetBoxのダウンロード
リリースアーカイブから取得する方法とgitでcloneする方法の2つが用意されています。
今回はgitを採用します。
sudo apt install -y python3 python3-pip python3-venv python3-dev build-essential libxml2-dev libxslt1-dev libffi-dev libpq-dev libssl-dev zlib1g-dev
sudo apt install -y git
pythonのバージョンが3.10以上であることを確認しておきましょう。
python3 -V
Python 3.12.3
netbox用のディレクトリを作成し、そこにcloneをダウンロードします。
sudo mkdir -p /opt/netbox/ && cd /opt/netbox/ && sudo git clone -b master --depth 1 https://github.com/netbox-community/netbox.git .
NetBoxではmasterブランチのdepth=1のところに最新の安定版のリリースがあるとのこと。
ユーザーの作成
システムユーザーを作成します。ここで作成したユーザーがWSGIとHTTPのサービスを管理します。
sudo adduser --system --group netbox && sudo chown --recursive netbox /opt/netbox/netbox/media/ && sudo chown --recursive netbox /opt/netbox/netbox/reports/ && sudo chown --recursive netbox /opt/netbox/netbox/scripts/
コンフィグの設定
cd /opt/netbox/netbox/netbox/ && sudo cp configuration_example.py configuration.py
作成したconfiguration.py
を編集します。
公式によると最低限、下記の4つを設定する必要があるみたいです。
- ALLOWED_HOSTS
- DATABASE
- REDIS
- SECRET_KEY
ALLOWED_HOSTS
ALLOWED_HOSTS
は少なくとも1つのIPアドレス、もしくはFQDNが必要です。
これはnetboxのサーバー本体のIPアドレスかFQDNを指定する必要があります。
設定漏れを回避するためか、exampleからコピーしただけでは空欄となっています。
*
によるワイルドカードも指定可能です。
お家サーバーや検証環境レベルなら*
でもいいのかもしれません。
その場合は以下のような表記になります。
ALLOWED_HOSTS = ['*']
DATABASE
DATABASE
はUSER
とPASSWORD
が空欄になっています。
01で作成したDB用のユーザー名とパスワードを記載してください。
REDIS
REDIS
はデフォルトのままで大丈夫だと思います。
SECRET_KEY
SECRET_KEY
はハッシュやソルトに使用する50文字以上のユニークな値が必要になります。
generate_secret_key.py
が用意されているため、特にこだわりがない場合はこちらを使うのがお手軽だと思います。
python3 ../generate_secret_key.py
生成された値をconfiguration.py
のSECRET_KEY
に記載します。
その他
他にも設定ができますが、詳しくは公式のインストールガイドを参照してください。
リモートのファイルストレージが使えたりするみたいです。
インストール
configuration.py
の設定が終わったらインストールに進みます。
upgrade.sh
が用意されており、実行することでインストールが開始されます。
sudo /opt/netbox/upgrade.sh
(前略)
Completed.
Removing expired user sessions (python3 netbox/manage.py clearsessions)...
Upgrade complete! Don't forget to restart the NetBox services:
> sudo systemctl restart netbox netbox-rq
アプリケーション用のユーザーの作成
upgrade.shは必要なパッケージやDBのマイグレーションのみを実行しており、アプリケーションの管理ユーザーは作成されていません。ログインをするためにも管理ユーザーの作成が必要になります。
下記のコマンドでPythonのvirtual environmentに入ります。
source /opt/netbox/venv/bin/activate
プロンプトの前に(venv)
が付いていることを確認して、下記のコマンドを実行します。
実行すると管理ユーザーのユーザー名やパスワードの入力を求められます。
cd /opt/netbox/netbox
python3 manage.py createsuperuser
Username:
Email address:
Password:
Password (again):
Superuser created successfully.
この後もPythonのvirtual environmentは維持したまま設定をしていきます。
netbox-housekeeping.sh の登録
古くなったセッションなどをクリーニングするためのシェルが用意されています。
手動で実行することもできますが、公式のインストールガイドではcronによるデイリーベースのシェルの実行を推奨しています。
sudo ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
お試しでアプリケーションを起動
下記のコマンドでアプリケーションを実行します。
python3 manage.py runserver 0.0.0.0:8000 --insecure
Performing system checks...
System check identified no issues (0 silenced).
November 02, 2024 - 14:00:42
Django version 5.0.9, using settings 'netbox.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
起動が確認できたら、ブラウザからIPアドレスかFQDNにポート8000を指定してアクセスしてみます。
ログイン画面で管理ユーザーのユーザー名とパスワードを指定してログインができるか確認します。
- httpであることに注意 (httpsではない)
アクセスできない場合、サーバー側のファイアーウォールを確認してみてください。
ログインが確認できたらコンソールに戻り、ctrl+c
でアプリケーションを停止します。
Gunicornの設定
WSGIとして公式のインストールガイドではGunicornとuWSGIの2つが候補にあげられています。
今回はGunicornを採用しました。
sudo cp /opt/netbox/contrib/gunicorn.py /opt/netbox/gunicorn.py
sudo cp -v /opt/netbox/contrib/*.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now netbox netbox-rq
下記のコマンドで起動状態を確認します。
systemctl status netbox.service
● netbox.service - NetBox WSGI Service
Loaded: loaded (/etc/systemd/system/netbox.service; enabled; preset: enabled)
Active: active (running) since Sat 2024-11-02 14:17:57 UTC; 6s ago
Docs: https://docs.netbox.dev/
Main PID: 5075 (gunicorn)
Tasks: 6 (limit: 9444)
Memory: 525.7M (peak: 526.2M)
CPU: 4.139s
CGroup: /system.slice/netbox.service
├─5075 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/netbox --config /opt/netb>
├─5077 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/netbox --config /opt/netb>
├─5078 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/netbox --config /opt/netb>
├─5079 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/netbox --config /opt/netb>
├─5080 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/netbox --config /opt/netb>
└─5081 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/netbox --config /opt/netb>Nov 02 14:17:57 net-box systemd[1]: Started netbox.service - NetBox WSGI Service.
Nov 02 14:17:57 net-box gunicorn[5075]: [2024-11-02 14:17:57 +0000] [5075] [INFO] Starting gunicorn 23.0.0
HTTPサーバーの設定
HTTPサーバーもnginxとapacheの2つの選択肢が用意されています。
今回はnginxを採用します。
証明書
自宅のVM用のIPAMのため、証明書は自己証明書とします。
ちゃんとした(?)証明書が必要な方は公式のインストールガイドを参照してください。
let's encrypt
などが候補にあげられています。
https://netbox.readthedocs.io/en/stable/installation/5-http-server/
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/netbox.key -out /etc/ssl/certs/netbox.crt
nginxの設定
sudo apt install -y nginx
事前に用意されたnginx用のコンフィグファイル/opt/netbox/contrib/nginx.conf
を編集します。
netbox.example.com
をconfiguration.py
で設定したALLOWED_HOSTS
と同じ値に書き換えてください。
その後、nginxのディレクトリにコピーします。
sudo cp /opt/netbox/contrib/nginx.conf /etc/nginx/sites-available/netbox
またnginxにあるデフォルトのsite-enabledのファイルを削除し、netbox用のファイルをリンクで配置します。
sudo rm /etc/nginx/sites-enabled/default && sudo ln -s /etc/nginx/sites-available/netbox /etc/nginx/sites-enabled/netbox
また、nginxの起動前にこちらのファイルも書き換えが必要になります。
server_name
の値をconfiguration.py
で設定したALLOWED_HOSTS
と同じ値に書き換えてください。
ALLOWED_HOSTS
を'*'
で設定している場合、下記の設定にしないとnginxがエラーで立ち上がりません。
server_name '_';
最後にnginxを再起動し、ブラウザからアクセスできることを確認してください。
sudo systemctl restart nginx
- httpsであることに注意
おわりに
公式ドキュメントがしっかりしているため、特に詰まることなく構築することができました。
構築の難易度はかなり低めなのかなと思います。
(外部DBやLDAPなど、今回は使わなかったオプションを使うとまた違うとは思いますが・・・)
いずれお家DNSで使っているBINDのZONEファイルへの連携ができればいいなと思いつつ、まずはこのあたりで満足しようと思います。
また、初期構築完了時のディスクの使用率は以下のとおりでした。
disk 2,3は2Gくらいでも十分だったかもしれません。
Filesystem | Size | Used | Avail | Use% | Mounted on |
---|---|---|---|---|---|
tmpfs | 795M | 1.1M | 794M | 1% | /run |
/dev/mapper/ubuntu--vg-ubuntu--lv | 9.8G | 3.2G | 6.1G | 35% | / |
tmpfs | 3.9G | 1.1M | 3.9G | 1% | /dev/shm |
tmpfs | 5.0M | 0 | 5.0M | 0% | /run/lock |
/dev/sdb | 16G | 467M | 15G | 4% | /opt |
/dev/sdc | 32G | 267M | 30G | 1% | /var/lib |
/dev/sda2 | 1.7G | 95M | 1.5G | 6% | /boot |
tmpfs | 795M | 12K | 795M | 1% | /run/user/1000 |