手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 22.04 Podman NetBox 環境構築

目次に戻る

Overview

Podman を使用して NetBox を構築します。

Docker Compose

NetBox Community が NetBox の Docker Compose を Git で公開しています。今回は、これを参考にして Podman で NetBox を構築していきます。私はあまり Docker Compose が好きではないこともあり、積極的に Docker Compose を学ぶことも少ないのですが、これまで見てきた docker-compose.yml よりも複雑な気がしますね。

myadmin@ubuntu:~$ git clone -b release https://github.com/netbox-community/netbox-docker.git
myadmin@ubuntu:~$ ls -l netbox-docker
合計 112
-rw-rw-r-- 1 myadmin myadmin  4923  7月 16 20:45 Dockerfile
-rw-rw-r-- 1 myadmin myadmin 10175  7月 16 20:45 LICENSE
-rw-rw-r-- 1 myadmin myadmin  7369  7月 16 20:45 README.md
-rw-rw-r-- 1 myadmin myadmin     6  7月 16 20:45 VERSION
drwxrwxr-x 2 myadmin myadmin  4096  7月 16 20:45 build-functions
-rwxrwxr-x 1 myadmin myadmin  2665  7月 16 20:45 build-latest.sh
-rwxrwxr-x 1 myadmin myadmin 15096  7月 16 20:45 build.sh
drwxrwxr-x 3 myadmin myadmin  4096  7月 16 20:45 configuration
drwxrwxr-x 2 myadmin myadmin  4096  7月 16 20:45 docker
-rw-rw-r-- 1 myadmin myadmin   877  7月 16 20:45 docker-compose.override.yml.example
-rw-rw-r-- 1 myadmin myadmin    77  7月 16 20:45 docker-compose.test.override.yml
-rw-rw-r-- 1 myadmin myadmin  1800  7月 16 20:45 docker-compose.test.yml
-rw-rw-r-- 1 myadmin myadmin  2267  7月 16 20:45 docker-compose.yml
drwxrwxr-x 2 myadmin myadmin  4096  7月 16 20:45 env
-rw-rw-r-- 1 myadmin myadmin   359  7月 16 20:45 pyproject.toml
-rwxrwxr-x 1 myadmin myadmin  4981  7月 16 20:45 release.sh
-rw-rw-r-- 1 myadmin myadmin   244  7月 16 20:45 renovate.json
-rw-rw-r-- 1 myadmin myadmin   127  7月 16 20:45 requirements-container.txt
drwxrwxr-x 2 myadmin myadmin  4096  7月 16 20:45 test-configuration
-rwxrwxr-x 1 myadmin myadmin  3222  7月 16 20:45 test.sh

Pod

最初に Pod を作成します。今回は 10002 ポートを nginx ( NetBox の TLS リバースプロキシ) に転送します。

myadmin@ubuntu:~$ sudo podman pod create -n netbox-pod -p 10002:443
myadmin@ubuntu:~$ sudo podman pod ls

共通ディレクトリの作成

ディレクトリを作成します。NetBox としてのトップディレクトリは /opt/container/netbox とします。

myadmin@ubuntu:~$ sudo mkdir -p /opt/container/netbox/env

PostgreSQL

PostgreSQL コンテナを作成します。

myadmin@ubuntu:~$ sudo podman run -d --pod netbox-pod --name netbox-postgresql \
-e 'TZ=Asia/Tokyo' \
-e 'POSTGRES_DB=netbox' \
-e 'POSTGRES_PASSWORD=password' \
-e 'POSTGRES_USER=netbox' \
-v netbox-postgres-data:/var/lib/postgresql/data \
docker.io/postgres:15-alpine
myadmin@ubuntu:~$ sudo podman ps
myadmin@ubuntu:~$ sudo podman volume ls

Redis

Redis コンテナを作成します。Redis のデフォルトのポート番号は 6379 となりますが、今回、同一 Pod 内で Redis, Redis Cache の 2 つのコンテナを動かすため、ポート番号を分ける必要があります。

myadmin@ubuntu:~$ sudo podman run -d --pod netbox-pod --name netbox-redis \
-e 'TZ=Asia/Tokyo' \
-e 'REDIS_PASSWORD=password' \
-v netbox-redis-data:/data \
docker.io/redis:7-alpine \
redis-server --port 6379 --appendonly yes --requirepass password
myadmin@ubuntu:~$ sudo podman ps
myadmin@ubuntu:~$ sudo podman volume ls

Redis Cache

Redis Cache コンテナを作成します。

myadmin@ubuntu:~$ sudo podman run -d --pod netbox-pod --name netbox-redis-cache \
-e 'TZ=Asia/Tokyo' \
-e 'REDIS_PASSWORD=password' \
-v netbox-redis-cache-data:/data \
docker.io/redis:7-alpine \
redis-server --port 6380 --requirepass password
myadmin@ubuntu:~$ sudo podman ps
myadmin@ubuntu:~$ sudo podman volume ls

NetBox

NetBox コンテナを作成します。

ディレクトリの作成とファイルの配置

ファイルを配置します。configuration は netbox コンテナが bind mount します。

myadmin@ubuntu:~$ sudo mkdir -p /opt/container/netbox/netbox
myadmin@ubuntu:~$ sudo cp -a netbox-docker/configuration /opt/container/netbox/netbox

CSRF_TRUSTED_ORIGINS

今回は、NetBox の TLS 化のために Nginx のリバースプロキシを使用しますが、NetBox のデフォルトでは CSRF (クロスサイトリクエストフォージェリ)として検知されてしまうため、以下のように CSRF_TRUSTED_ORIGINS を設定します。本当は環境変数から指定したいところですが、バグ?なのか効かないようです。

myadmin@ubuntu:~$ sudo vi /opt/container/netbox/netbox/configuration/configuration.py
# CSRF_TRUSTED_ORIGINS = _environ_get_and_map('CSRF_TRUSTED_ORIGINS', '', _AS_LIST)
CSRF_TRUSTED_ORIGINS = ['https://netbox.si1230.com:10002']

環境変数

netbox コンテナの環境変数は大量にあるため、個別に環境変数ファイルを作成して読み込みます。docker-compose.yml でもこのようになっています。Podman では同じ Pod に所属するコンテナ同士は 127.0.0.1 でアクセス可能となります。Redis, Redis Cache はポート番号を分けているため、明示的にポート番号を指定しています。

myadmin@ubuntu:~$ sudo tee /opt/container/netbox/env/netbox.env <<"EOF"
TZ=Asia/Tokyo
CORS_ORIGIN_ALLOW_ALL=True
DB_HOST=127.0.0.1
DB_NAME=netbox
DB_PASSWORD=password
DB_USER=netbox
EMAIL_FROM=netbox@si1230.com
EMAIL_PASSWORD=
EMAIL_PORT=25
EMAIL_SERVER=mail.si1230.com
EMAIL_SSL_CERTFILE=
EMAIL_SSL_KEYFILE=
EMAIL_TIMEOUT=5
EMAIL_USERNAME=netbox
EMAIL_USE_SSL=false
EMAIL_USE_TLS=false
GRAPHQL_ENABLED=true
HOUSEKEEPING_INTERVAL=86400
MEDIA_ROOT=/opt/netbox/netbox/media
METRICS_ENABLED=false
REDIS_CACHE_DATABASE=1
REDIS_CACHE_HOST=127.0.0.1
REDIS_CACHE_INSECURE_SKIP_TLS_VERIFY=false
REDIS_CACHE_PASSWORD=password
REDIS_CACHE_SSL=false
REDIS_CACHE_PORT=6380
REDIS_DATABASE=0
REDIS_HOST=127.0.0.1
REDIS_INSECURE_SKIP_TLS_VERIFY=false
REDIS_PASSWORD=password
REDIS_SSL=false
REDIS_PORT=6379
RELEASE_CHECK_URL=https://api.github.com/repos/netbox-community/netbox/releases
SECRET_KEY=r(m)9nLGnz$(_q3N4z1k(EFsMCjjjzx08x9VhNVcfd%6RF#r!6DE@+V5Zk2X
SKIP_SUPERUSER=true
WEBHOOKS_ENABLED=true
EOF

コンテナの実行

コンテナを実行します。

myadmin@ubuntu:~$ sudo podman run -d --pod netbox-pod --name netbox \
--env-file /opt/container/netbox/env/netbox.env \
-v /opt/container/netbox/netbox/configuration:/etc/netbox/config:ro \
-v netbox-media-files:/opt/netbox/netbox/media:rw \
-v netbox-reports-files:/opt/netbox/netbox/reports:rw \
-v netbox-scripts-files:/opt/netbox/netbox/scripts:rw \
docker.io/netboxcommunity/netbox:v3.5-2.6.1
myadmin@ubuntu:~$ sudo podman ps
myadmin@ubuntu:~$ sudo podman volume ls

NetBox Worker

コンテナを実行します。先述の Redis, Redis Cache のように、同じ netbox イメージから netbox, netbox-worker, netbox-housekeeping のコンテナを起動するため、ポート番号を分ける必要があるのではと思いましたが、問題なく稼働しています。コンテナなので調査も面倒なので、一旦放置しますが、後からきちんと調べて把握しておきたいところです。

myadmin@ubuntu:~$ sudo podman run -d --pod netbox-pod --name netbox-worker \
--env-file /opt/container/netbox/env/netbox.env \
-v /opt/container/netbox/netbox/configuration:/etc/netbox/config:ro \
-v netbox-media-files:/opt/netbox/netbox/media:rw \
-v netbox-reports-files:/opt/netbox/netbox/reports:rw \
-v netbox-scripts-files:/opt/netbox/netbox/scripts:rw \
docker.io/netboxcommunity/netbox:v3.5-2.6.1 \
/opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py rqworker
myadmin@ubuntu:~$ sudo podman ps

NetBox Housekeeping

コンテナを実行します。

myadmin@ubuntu:~$ sudo podman run -d --pod netbox-pod --name netbox-housekeeping \
--env-file /opt/container/netbox/env/netbox.env \
-v /opt/container/netbox/netbox/configuration:/etc/netbox/config:ro \
-v netbox-media-files:/opt/netbox/netbox/media:rw \
-v netbox-reports-files:/opt/netbox/netbox/reports:rw \
-v netbox-scripts-files:/opt/netbox/netbox/scripts:rw \
docker.io/netboxcommunity/netbox:v3.5-2.6.1 \
/opt/netbox/housekeeping.sh
myadmin@ubuntu:~$ sudo podman ps

Nginx

Nginx コンテナを作成します。

ディレクトリの作成とファイルの配置

TLS 証明書を配置( TLS 証明書の作成はこちらを参照)して、Nginx の設定ファイルを作成しています。本稿での Nginx はリバースプロキシとして使用します。http://127.0.0.1:8080 は Netbox コンテナのポート番号です。

myadmin@ubuntu:~$ sudo mkdir -p /opt/container/netbox/nginx/conf.d
myadmin@ubuntu:~$ sudo cp /home/myadmin/work/easy-rsa/pki/{issued/si1230.com.crt,private/si1230.com.key} /opt/container/netbox/nginx/conf.d
myadmin@ubuntu:~$ sudo tee /opt/container/netbox/nginx/conf.d/proxy.conf <<"EOF"
server {
    listen 443 ssl;
    server_name netbox.si1230.com;
    ssl_certificate /etc/nginx/conf.d/si1230.com.crt;
    ssl_certificate_key /etc/nginx/conf.d/si1230.com.key;
    location / {
        proxy_pass http://127.0.0.1:8080;
    }
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
}
EOF

コンテナの実行

コンテナを実行します。

myadmin@ubuntu:~$ sudo podman run -d --pod netbox-pod --name netbox-nginx \
-e 'TZ=Asia/Tokyo' \
-v /opt/container/netbox/nginx/conf.d:/etc/nginx/conf.d \
docker.io/library/nginx
myadmin@ubuntu:~$ sudo podman ps

NetBox へのアクセス

最初にコンソールからユーザーを作成する必要があります。

myadmin@ubuntu:~$ sudo podman exec -it netbox bash
root@netbox-pod:/opt/netbox/netbox# python3 manage.py createsuperuser

以下で NetBox にアクセスできます。

https://netbox.si1230.com:10002

systemd

systemd で NetBox を制御します。

systemd ユニットファイル

systemd ユニットファイルを生成します。

myadmin@ubuntu:~$ cd /etc/systemd/system && sudo podman generate systemd -f -n netbox-pod && cd
/etc/systemd/system/container-netbox-nginx.service
/etc/systemd/system/container-netbox-postgresql.service
/etc/systemd/system/container-netbox.service
/etc/systemd/system/container-netbox-redis-cache.service
/etc/systemd/system/container-netbox-worker.service
/etc/systemd/system/pod-netbox-pod.service
/etc/systemd/system/container-netbox-housekeeping.service
/etc/systemd/system/container-netbox-redis.service

systemd ユニットファイルの有効化

systemd を再起動して、追加したユニットファイルを読み込みます。

myadmin@ubuntu:~$ sudo systemctl daemon-reload

systemd を使用した Podman の操作

systemd から netbox-pod を操作してみます。

myadmin@ubuntu:~$ sudo systemctl status pod-netbox-pod.service
myadmin@ubuntu:~$ sudo systemctl start pod-netbox-pod.service
myadmin@ubuntu:~$ sudo systemctl stop pod-netbox-pod.service
myadmin@ubuntu:~$ sudo systemctl restart pod-netbox-pod.service

systemd の自動起動設定

システム起動時に netbox-pod が起動するように systemd を設定します。

myadmin@ubuntu:~$ sudo systemctl enable pod-netbox-pod.service
myadmin@ubuntu:~$ sudo systemctl is-enabled pod-netbox-pod.service
enabled

クリーンアップ

何度か作り直すことを想定し、これまでに構築した内容を初期化するコマンドです。

myadmin@ubuntu:~$
sudo rm /etc/systemd/system/pod-netbox-*
sudo rm /etc/systemd/system/container-netbox-*
sudo systemctl daemon-reload
sudo podman rm -f netbox-nginx netbox-housekeeping netbox-worker netbox netbox-redis-cache netbox-redis netbox-postgresql
sudo podman volume rm netbox-scripts-files netbox-reports-files netbox-media-files netbox-redis-cache-data netbox-redis-data netbox-postgres-data
sudo podman pod rm netbox-pod
sudo rm -r /opt/container/netbox

目次に戻る

Ubuntu 22.04 Podman NetBox 環境構築

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る