Switch und Router Konfiguration mit Oxidized sichern


Oxidized ist ein Backuptool um von diversen Netzwerkgeräten automatisch die Konfiguration zu sichern.
Aktuell werden mehr als 130 verschiedene Betriebssysteme unterstützt.

Folgende Hardware hab ich bei mir mit Oxidized gesichert:

  • MikroTik Router
  • Ubiquiti EdgeRouter Lite
  • Zyxel GS1900-24 Switch
  • HP V1910-24G Switch
  • APC AP9630 USV Network Management Card

Oxidized

Für die Installation nutze ich ein Debian 10.

Zuerst müssen ein paar Abhängigkeiten installiert werden.

apt install -y ruby ruby-dev libsqlite3-dev libssl-dev pkg-config make cmake libssh2-1-dev libicu-dev zlib1g-dev g++

Oxidized installieren.

gem install oxidized
gem install oxidized-script oxidized-web

Neuen Benutzer oxidized anlegen. (sollte nicht als root ausgeführt werden)

useradd --home-dir /home/oxidized --create-home --user-group --shell /usr/sbin/nologin oxidized

Verzeichnisstruktur erstellen.

mkdir /home/oxidized/backups
mkdir -p /home/oxidized/.config/oxidized

Die Konfigurationsdatei /home/oxidized/.config/oxidized/config erstellen.

# globale Variablen
resolve_dns: false
# wie oft (in Sekunden) werden Daten abgeholt (jede Stunde ist bei mir overkill, zum testen aber ok)
interval: 3600
log: /home/oxidized/.config/oxidized/oxidized.log
pid: /home/oxidized/.config/oxidized/oxidized.pid
use_syslog: true
debug: false
threads: 30
timeout: 20
retries: 3
prompt: !ruby/regexp /^([\w.@-]+[#>]\s?)$/
next_adds_job: false

# Webinterface auf allen IP Adressen aktivieren
rest: 0.0.0.0:8888

# wird für den HP V1910 Switch benötigt
vars:
  comware_cmdline: "512900"

# wie wird die Konfiguration von den Geräten geholt
input:
  default: ssh, ftp
  debug: false
  ssh:
    secure: false

# wie wird die Konfiguration abgespeichert
output:
  default: file
  file:
    directory: /home/oxidized/backups/configs

# Datenquelle der Geräteliste
source:
  default: csv
  csv:
    file: /home/oxidized/.config/oxidized/router.db
    delimiter: !ruby/regexp /:/
    # welches Feld ist welches in der csv
    map:
      name: 0
      ip: 1
      model: 2
      group: 3
      username: 4
      password: 5
    vars_map:
      enable: 6

# Zuordnung von model zu OS Typ
model_map:
  apc: apc_aos
  mikrotik: routeros
  ubiquiti: edgeos
  zyxel: zynosgs
  hp: comware

# nachdem alle Nodes abgearbeitet wurden, wird jede neue Sicherung auf die Endung mit _Datum kopiert
hooks:
  name_versioning:
    type: exec
    events: [nodes_done]
    cmd: 'find /home/oxidized/backups -type f ! -name "*_*" -execdir cp {} {}_`date +"%Y%m%d_%M"` ";"'

Die Datenquelle /home/oxidized/.config/oxidized/router.db erstellen.

# name:ip:model:group:username:password (der group Name wird automatisch als Verzeichnis erstellt)
ub-router-1:192.168.80.202:ubiquiti:router:username:password
mt-router-1:192.168.80.1:mikrotik:router:username:password
mt-router-2:192.168.80.2:mikrotik:router:username:password
mt-router-3:192.168.80.3:mikrotik:router:username:password
zy-switch-1:192.168.80.16:zyxel:switch:username:password
zy-switch-2:192.168.80.17:zyxel:switch:username:password
zy-switch-3:192.168.80.18:zyxel:switch:username:password
hp-switch-1:192.168.80.189:hp:switch:username:password
apc-usv-1:192.168.80.8:apc:usv:username:password

Zum Abschluß die Berechtigungen nochmals anpassen.

chown -R oxidized:oxidized /home/oxidized/

Startscript /etc/systemd/system/oxidized.service erstellen.

[Unit]
Description=Oxidized - Network Device Configuration Backup Tool
After=network-online.target multi-user.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/bin/oxidized
User=oxidized
KillSignal=SIGKILL

[Install]
WantedBy=multi-user.target

Den neuen Service aktivieren und starten.

systemctl daemon-reload
systemctl enable oxidized.service
systemctl start oxidized.service

Nach dem Start verucht Oxidized sich die Konfiguration der eingetragenen Geräte zu holen und als Textdatei abzulegen.

root@oxidized:/# tree /home/oxidized/backups/
/home/oxidized/backups/
|-- router
|   |-- mt-router-1
|   |-- mt-router-2
|   |-- mt-router-3
|   `-- ub-router-1
|-- switch
|   |-- hp-switch-1
|   |-- zy-switch-1
|   |-- zy-switch-2
|   `-- zy-switch-3
`-- usv
    `-- apc-usv-1

Oxidized Hooks

Die einzelnen Sicherungen werden bei jedem neuen Durchlauf überschrieben. Es ist also immer nur die aktuelle Sicherung vorhanden.
Um das zu umgehen nutze ich einen exec hook. Nachdem alle Nodes abgefragt wurden, wird ein Befehl ausgeführt.

In meinem Fall sucht find alle Dateien im Verzeichnis backups ohne ein _ im Namen und kopiert diese dann auf die Endung _Datum_StundeMinute.
Somit hab ich jetzt immer alle Sicherungen und nebenbei auch noch eine einfache Versionsverwaltung.

root@oxidized:/# tree /home/oxidized/backups/
/home/oxidized/backups/
|-- router
|   |-- mt-router-1
|   |-- mt-router-1_20191207_1429
|   |-- mt-router-1_20191207_1529
|   |-- mt-router-1_20191207_1629
|   |-- mt-router-2
|   |-- mt-router-2_20191207_1429
|   |-- mt-router-2_20191207_1529
|   |-- mt-router-2_20191207_1629
|   |-- mt-router-3
|   |-- mt-router-3_20191207_1429
|   |-- mt-router-3_20191207_1529
|   |-- mt-router-3_20191207_1629
|   |-- ub-router-1
|   |-- ub-router-1_20191207_1429
|   |-- ub-router-1_20191207_1529
|   `-- ub-router-1_20191207_1629
|-- switch
|   |-- zy-switch-1
|   |-- zy-switch-1_20191207_1429
|   |-- zy-switch-1_20191207_1529
|   |-- zy-switch-1_20191207_1629
|   |-- zy-switch-2
|   |-- zy-switch-2_20191207_1429
|   |-- zy-switch-2_20191207_1529
|   |-- zy-switch-2_20191207_1629
|   |-- zy-switch-3
|   |-- zy-switch-3_20191207_1429
|   |-- zy-switch-3_20191207_1529
|   `-- zy-switch-3_20191207_1629
`-- usv
    |-- apc-usv-1
    |-- apc-usv-1_20191207_1429
    |-- apc-usv-1_20191207_1529
    `-- apc-usv-1_20191207_1629

Oxidized Webinterface

Schöner Überblick über den Status der einzelnen Geräte und Sicherungen.

Oxidized Fehlersuche

Lässt sich Oxidized nicht starten oder wird ein Gerät nicht ausgelesen, in der config debug auf true setzen und sich die logfiles anschauen!
Nach Änderungen an der Konfiguration immer den oxidized.service neu starten.

Oxidized mit LibreNMS

Monitored man die Geräte mit LibreNMS, lässt sich mit ein paar klicks Oxidized einbinden. (LibreNMS 3rd Party Integration Oxidized)
In LibreNMS oben auf das Zahnrad → Global Settings → External → Oxidized Integration, aktivieren und die API URL eingeben.

Pro Gerät hat man jetzt einen Config Reiter über den man sich die aktuelle Konfiguration anzeigen lassen kann.

Damit das reibungslos funktioniert, müssen die Gerätenamen (hostnamen) in LibreNMS und Oxidized gleich sein!

5 Gedanken zu „Switch und Router Konfiguration mit Oxidized sichern“

  1. Hi,

    funktioniert Oxidized eigentlich nur mit Input wie oben beschrieben?

    Wir haben zwei HP ProCurves – allerdings solche, die nur Login via http und nicht per ssh unterstützen:
    1. HP 1810-24G, PL.2.10, eCos-3.0, 1_12_8-customized-h
    2. HPE OfficeConnect Switch 1820 24G PoE+ (185W) J9983A, PT.02.09, Linux 3.6.5-45630aff, U-Boot 2012.10-00119-gae4e43bd91 (Aug 31 2018 – 10:12:27)

    In LibreNMS werden sie von Oxidized zwar erkannt, aber – da ein Login eben nicht via ssh läuft – gibt es dann die Fehlermeldung “node not found”.

    Ich hatte schon versucht bei Input neben ssh und ftp auch http einzutragen, dies führte aber zu einer Fehlermeldung. Des Weiteren wäre da auch die Frage in wiefern dann die Reihenfolge der entsprechenden Links definiert wird.

    Mit freundlichen Grüßen
    A. Hermann

    Antworten
  2. Hallo,

    ich habe Probleme mit Oxidized auf einem neuen Ubuntu 24.04.2 LTS Server und bräuchte eure Hilfe bei der Fehlersuche.

    Ziel: Konfiguration eines ArubaOS-CX Switches (10.0.6.160) mittels Oxidized sichern.

    Meine Umgebung:

    Betriebssystem: Ubuntu Server 24.04.2 LTS (neu installiert).

    Oxidized-Version: 0.33.0 (installiert via sudo gem install oxidized).

    Konfiguration:

    Oxidized läuft als systemd-Dienst unter dem dedizierten Benutzer oxidized.

    Konfigurationsdateien (config, router.db) liegen in /opt/oxidized/.config/oxidized/ (und wurden testweise auch nach /root/.config/oxidized/ kopiert, da sudo verwendet wird).

    router.db enthält den Switch: HOTSWm6000-8-1:10.0.6.160:aoscx:aruba_cx_switches.

    config ist mit den korrekten admin-Zugangsdaten (username: admin, password: admin) konfiguriert.

    Was ich bereits getan habe (und erfolgreich war):

    Systemvorbereitung: Ubuntu 24.04.2 LTS neu installiert, apt update/upgrade durchgeführt.

    Abhängigkeiten: ruby, ruby-dev, build-essential, libssl-dev, zlib1g-dev, cmake, pkg-config wurden erfolgreich installiert.

    Oxidized-Installation: sudo gem install oxidized lief nach der Installation aller Abhängigkeiten fehlerfrei durch.

    Benutzer & Berechtigungen: Dedizierter Systembenutzer oxidized erstellt, alle relevanten Ordner (/opt/oxidized/, /.config/oxidized/) gehören oxidized:oxidized und haben die notwendigen Berechtigungen (u.a. 755 oder 777 testweise).

    SSH-Verbindung: Die SSH-Verbindung zum Switch funktioniert manuell vom Server aus mit den konfigurierten Zugangsdaten.

    Oxidized-Service: Der systemd-Dienst für Oxidized startet fehlerfrei (Active: active (running)).

    Das Problem (widersprüchliches Verhalten):

    Obwohl die Verbindung und das Abrufen der Konfiguration erfolgreich sind, werden die Backups nicht gespeichert.

    Log-Meldungen (wenn debug: true oder journalctl):

    Oxidized meldet stets:

    Oxidized::SSH ran for HOTSWm6000-8-1 successfully

    Und unmittelbar danach:

    Config fetched for HOTSWm6000-8-1 at YYYY-MM-DD HH:MM:SS UTC

    Wenn

    output: file konfiguriert ist, erscheint sogar die Meldung: INFO — : Configuration updated for aruba_cx_switches/HOTSWm6000-8-1

    Tatsächliches Ergebnis:

    Beim Konfigurieren von output: file (z.B. directory: /opt/oxidized/backups_plain/ oder directory: /tmp/oxidized_test_backups/):

    Die angegebenen Ordner bleiben leer (ls -l zeigt total 0).

    Es erscheinen keine Dateien, obwohl Oxidized im Log “Configuration updated” meldet.

    Beim Konfigurieren von output: git (wie ursprünglich gewünscht):

    sudo git –git-dir=/opt/oxidized/configs.git log –all zeigt immer fatal: your current branch ‘master’ does not have any commits yet.

    Es werden keine Commits erstellt, obwohl das Konfigurations-Fetch im Log erfolgreich ist.

    Zusammenfassung:
    Oxidized stellt eine erfolgreiche Verbindung her, ruft die Konfiguration ab und meldet sogar, dass diese “aktualisiert” bzw. “gespeichert” wurde. Die Dateien erscheinen jedoch weder im konfigurierten File-Output-Verzeichnis noch als Commits im Git-Repository. Dies deutet auf einen internen Fehler bei der Übergabe der Daten an das Output-Modul oder bei der tatsächlichen Speicherung hin, möglicherweise ein Kompatibilitätsproblem mit Oxidized v0.33.0 in dieser spezifischen Ubuntu-Umgebung.

    Gibt es bekannte Probleme mit Oxidized v0.33.0, die ein solches Verhalten verursachen könnten, insbesondere in Bezug auf das “file”- oder “git”-Output-Modul, obwohl der Fetch-Vorgang erfolgreich ist? Was könnte der Grund für diese Diskrepanz zwischen Log-Meldungen und tatsächlicher Dateispeicherung sein?

    Vielen Dank für eure Hilfe!

    Antworten

Schreibe einen Kommentar