Tue, 10 Aug 2021 12:00:00 +0200
backup, container, docker, netbox, software, sysadmin

NetBox sichern und wiederherstellen

Verlasse ich mich für einen großen Teil der Netzwerkdokumentation auf NetBox, dann bin ich gut beraten, für deren Zuverlässigkeit zu sorgen. Dazu gehört, dass ich NetBox bei einem Ausfall des Rechners oder der VM, auf der es läuft, schnell wiederherstellen kann.

Ein naiver Ansatz, den ich leider schon in Produktivsystemen gesehen habe, ist, einfach die gesamte VM mit NetBox zu sichern. Das ist insbesondere bei virtuellen Systemen sehr bequem, hat aber einige gravierende Nachteile.

Zum einen wird viel zu viel gesichert. Das Betriebssystem interessiert mich bei NetBox weniger und die Software ist schon in einem Repository. Zum anderen habe ich bei einer Komplettsicherung des Systems entweder offene Dateien, was seine eigenen Probleme mit sich bringt, oder ich muss das System anhalten, wodurch es während der Sicherung nicht verfügbar ist. Aus diesen Gründen gibt es eine Komplettsicherung des Systems zu selten, gemessen an der Änderungshäufigkeit der Daten in der NetBox.

Besser ist, wenn ich nur die Daten der NetBox und ab und zu die Konfiguration sichere. Das hat den zusätzlichen Vorteil, dass ich eine neue Version der NetBox mit den aktuellen Daten auf einem neuen System ausgiebig testen kann, bevor ich dieses produktiv schalte.

Wie aber sichere ich NetBox? Was brauche ich dafür? Das ist erfreulicherweise wenig. Die Programme tar und bzip2 (oder gzip) reichen aus, alles andere ist bei einer NetBox-Installation enthalten.

Sichern

Auf drei Dinge muss ich mich bei der Sicherung und Wiederherstellung konzentrieren:

Die Datenbank enthält die eigentlichen Daten und Verknüpfungen, also letztendlich die Modelle.

Die Medien sind in NetBox hochgeladene Dateien, zum Beispiel Bilder.

Die Konfiguration enthält alle Informationen, um NetBox von Grund auf neu aufzusetzen.

Datenbank sichern

Da NetBox mit PostgreSQL als Datenbank läuft, sichere ich diese als Benutzer netbox mit dem Programm pg_dump und schreibe die komprimierte Ausgabe in meine Sicherungsdatei:

pg_dump netbox -c \
| bzip2 \
> netbox.sql.bz2

Die Option -c sorgt dafür, dass pg_dump SQL-Befehle zum Löschen alter Datenbankobjekte vor dem Erzeugen der neuen Objekte einfügt.

Habe ich bei der Installation einen anderen Benutzer verwendet als in der Installationsanleitung angegeben, muss ich mit diesem arbeiten.

Bei NetBox-Docker sieht der Befehl ähnlich aus, allerdings muss ich ihn im Container postgres ausführen. Dazu begebe ich mich in das Verzeichnis mit der Konfiguration für docker-compose:

cd ~/P/netbox-docker
docker-compose exec -T postgres \
sh -c 'pg_dump -cU $POSTGRES_USER $POSTGRES_DB' \
| bzip2 \
> db_dump.sql.bz2

Die Option -T sorgt dafür, dass docker-compose exec kein Pseudo-TTY anlegt, weil es für diesen Befehl nicht benötigt wird. Die Variablen $POSTGRES_USER und $POSTGRES_DB sind im Container auf die passenden Werte gesetzt.

Medien sichern

Die in NetBox hochgeladenen Medien befinden sich im Verzeichnis /opt/netbox/netbox/media. Mit folgendem Befehl kann ich sie sichern:

tar -C /opt/netbox/netbox/media \
    -cjf media-backup.tar.bz2 \
    ./

Bei NetBox-Docker rufe ich den tar Befehl im Container netbox auf und schreibe die Datei auf dem Host.

docker-compose exec -T netbox \
tar c -jf - -C /opt/netbox/netbox/media ./ \
> media-backup.tar.bz2

Konfiguration sichern

Die Konfiguration finde ich im Verzeichnis /opt/netbox/netbox/netbox und hole sie von dort ab.

tar -C /opt/netbox \
    -cjf netbox_config.tar.bz2 \
    netbox/netbox/configuration.py gunicorn.py

Bei manchen Versionen muss ich noch zusätzlich die Datei gunicorn.py direkt aus dem Verzeichnis /opt/netbox sichern. Bei dieser brauche ich keine Pfadangabe.

Bei NetBox-Docker ist die Konfiguration bereits in dem Git-Repository, mit dem ich NetBox-Docker installiert habe. Für meine Anpassungen lege ich einen neuen Zweig an und kann damit auch eventuell installierte Plugins erfassen. Diesen Zweig synchronisiere ich mit einem Repository auf einem anderen Rechner.

Wiederherstellen

Es gibt verschiedene Situationen, bei denen ich NetBox aus einer Sicherung wiederherstellen will:

Nach einem Systemausfall will ich dieselbe Installation mit den aktuellsten Daten so schnell wie möglich wiederherstellen.

Bei einem Upgrade will ich eine neue Version von NetBox mit den bisher erfassten Daten füllen.

In beiden Fällen erzeuge ich zunächst ein lauffähiges System, egal ob mit oder ohne Daten. Nach dem Systemausfall kann ich vielleicht auf eine hinreichend aktuelle Komplettsicherung des Systems zurückgreifen. Bei einem Upgrade setze ich NetBox komplett neu auf. Dabei kann mir die Konfiguration der alten NetBox helfen.

Datenbank wiederherstellen

Während die Datenbank wiederhergestellt wird darf kein anderer Prozess darauf zugreifen. Aus diesem Grund beende ich alle NetBox-Prozesse in der normalen Installation, lasse PostgreSQL jedoch weiterlaufen. Dann führe ich die folgenden Befehle aus:

psql -c 'drop database netbox'
psql -c 'create database netbox'
zcat db_dump.sql.gz \
| psql netbox

Anschließend kann ich NetBox wieder starten.

Bei NetBox-Docker beende ich zunächst die Container netbox und netbox-worker

docker-compose stop netbox netbox-worker

Anschließend lese ich die Datenbanksicherung ein:

bzcat db_dump.sql.bz2 \
| docker-compose exec -T postgres \
sh -c 'psql -U $POSTGRES_USER $POSTGRES_DB'

Habe ich die Datenbank nach einem Upgrade eingespielt, müssen die Upgrade-Scripts via netbox/manage.py laufen. Details dazu gibt die Dokumentation in den Release-Notes. In diesem Fall bin ich gut beraten, nach erfolgreicher Prüfung der neuen Version so schnell wie möglich eine neue Datenbanksicherung anzufertigen.

Medien wiederherstellen

Um die Medien wiederherzustellen, führe ich den folgenden Befehl als Benutzer netbox aus:

tar -C /opt/netbox/netbox/media \
    -xjf media-backup.tar.bz2

Bei NetBox-Docker führe ich den Befehl tar im Container netbox aus, lese die Daten aber auf dem Host.

docker-compose exec -T netbox \
tar x -jvf - -C /opt/netbox/netbox/media \
< media-backup.tar.bz2

Konfiguration

In den meisten Fällen will ich die Konfiguration nicht direkt wiederherstellen.

Bei einem Systemausfall reicht es, wenn ich eine Komplettsicherung einspielen kann, die nach der letzten Konfigurationsänderung entstanden ist. Bei NetBox-Docker kann ich das System aus dem Repository automatisch neu aufsetzen.

Lediglich bei einem Upgrade ist es vielleicht hilfreich, auf dem neuen System einen Blick in die Konfiguration des alten werfen zu können. Dazu entpacke ich die Konfigurationssicherung wie folgt.

tar -C /opt/netbox \
    -xjf netbox_config.tar.bz2

Damit habe ich die Grundlagen der Sicherung von NetBox angesprochen. Jetzt bleibt nur, regelmäßig zu sichern und ab und zu das Wiederherstellen zu üben.