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 120 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 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/logs
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!

Schreibe einen Kommentar