RANCID mit Git und Gitweb
Die Bedienoberfläche traditioneller kommerzieller Netzwerkgeräte ist fast immer eine mehr oder weniger gut bedienbare Kommandozeile. Dabei sichert man die Konfiguration als Textdatei, welche die nötigen Befehle enthält, um diese Konfiguration wiederherzustellen.
Mit RANCID gibt es ein Werkzeug zur Verwaltung dieser Konfigurationsdateien. Es holt die aktuelle Konfiguration automatisch von den Geräten und legt sie in einem Versionsverwaltungssystem (VCS) ab. Damit kann ich Änderungen in der Netzwerkkonfiguration nachverfolgen.
Zu diesem Zweck rufe ich das Skript rancid-run
via cron
regelmäßig auf.
Das Skript sammelt alle bekannten Konfigurationen
und checkt sie bei Änderungen im VCS ein.
Ursprünglich arbeitete RANCID mit CVS für die Versionsverwaltung, inzwischen unterstützt es auch Subversion und Git. Da ich CVS schon einige Jahre lang so gut wie gar nicht mehr benutze und mit Subversion nie richtig warm geworden bin, läuft bei mir RANCID mit Git mit einem einfachen Webinterface, um Änderungen auch mal eben mit dem Browser anschauen zu können.
Nachfolgend beschreibe ich die Einrichtung dieses Systems.
Benötigte Software
Für interaktive SSH- oder Telnet-Sitzungen verwendet RANCID Expect-Skripts. Mit diesen kann ich auch eine Konsolensitzung auf dem Gerät bekommen. GCC übersetzt einige Hilfsprogramme und Make steuert deren Übersetzung. Git will ich als VCS verwenden.
sudo apt install expect gcc git make
Zusätzlich installiere ich Stow, um mehrere Versionen von RANCID in verschiedenen Verzeichnissen installieren und bei Bedarf einfach zwischen diesen umschalten zu können. Für die Installation selbst ist es nicht notwendig.
sudo apt install stow
RANCID versendet bei Änderungen in den Konfigurationen E-Mails an verschiedene Adressen. Es braucht zwei Adressen pro Gerätegruppe, die es verwaltet. Da ich die Empfänger auf dem selben Rechner bestimmen will, auf dem RANCID selbst läuft, fallen zu einfache Mailserver, wie zum Beispiel Nullmailer aus. Ich verwende Postfix, weil ich damit die meiste Erfahrung habe und installiere es als Satellitensystem.
sudo apt install postfix
Benutzer für RANCID
Da RANCID automatisiert ablaufen soll
und in den meisten Fällen nicht von Hand aufgerufen wird,
lege ich einen eigenen Benutzer dafür an
und nehme dessen Identität für die nun folgende Installation an.
Dazu sollte dieser Benutzer sudo
verwenden können.
sudo adduser rancid
sudo adduser rancid sudo
sudo su - rancid
RANCID installieren
Zur Installation hole ich mir die aktuellen Quellen (zur Zeit ist das Version 3.13), packe sie aus und gehe in das neu angelegte Verzeichnis.
wget https://shrubbery.net/pub/rancid/rancid-3.13.tar.gz
tar xzf rancid-3.13.tar.gz
cd rancid-3.13
Dann konfiguriere ich die Installation nach meinen Wünschen:
./configure --with-git \
--prefix=/opt/rancid/stow/rancid-3.13 \
--localstatedir=/opt/rancid/var
Die Option --with-git
legt das verwendete VCS fest.
Mit der Option --prefix
lege ich
das Installationsverzeichnis für genau diese Version fest.
Ich habe hier bereits berücksichtigt,
dass ich die Installation mit Stow verwalten will.
Die Option --localstatedir
legt schließlich
das Verzeichnis fest,
unterhalb dessen die gesicherten Konfigurationen landen.
Anschließend übersetze und installiere ich RANCID:
make
sudo make install
Da ich mit Stow arbeite, muss ich nun mit diesem die Links zur gerade aktiven Version anlegen.
cd /opt/rancid/stow
sudo stow rancid-3.13
Zum Schluß übereigne ich das Verzeichnis, welches die Konfigurationen und Logs aufnimmt, dem Benutzer rancid, damit dieser dort schreiben darf.
sudo chown rancid: /opt/rancid/var
Außerdem setze ich ein paar Pfade
für den Benutzer rancid
in dessen .bashrc
PATH=$PATH:/opt/rancid/bin
if [ -n "$MANPATH" ]; then
MANPATH=$MANPATH:/opt/rancid/share/man
else
MANPATH=/usr/share/man:/usr/local/share/man:/opt/rancid/share/man
fi
Damit sind die Programme und Handbuchseiten für rancid im Suchpfad.
Konfiguration
RANCID ist nun installiert, um es verwenden zu können, muss ich es noch konfigurieren. Zum einen RANCID selbst, zum anderen den E-Mail-Versand.
Drei Stellen sind wichtig für die Konfiguration von RANCID:
- Die Datei rancid.conf enthält globale Einstellungen, die für alle Gerätegruppen gelten.
- Die Datei ~/.cloginrc enthält die Credentials zum Anmelden an den Geräten.
- Die Datei $GROUP/router.db enthält Angaben zur Art des Gerätes.
In meiner Installation befindet sich rancid.conf im Verzeichnis /opt/rancid/etc/.
Diese Datei wird von der Shell via source
eingelesen,
muss daher gültige Syntax für Shell-Scripts enthalten.
Darin passe ich die folgenden Variablen an:
BASEDIR=/opt/rancid/var
LIST_OF_GROUPS="mamawe"; export LIST_OF_GROUPS
SENDMAIL="/usr/lib/sendmail"
BASEDIR
gibt an, wo sich die Verzeichnisse für die Gerätegruppen befinden.
LIST_OF_GROUPS
ist eine durch Leerzeichen getrennte Liste von Gruppennamen.
Hier im Beispiel enthält die Liste nur die Gruppe mamawe.
SENDMAIL
enthält den kompletten Pfad zum Programm,
mit welchem die E-Mails versendet werden.
RANCID sendet E-Mail an folgende Adressen für alle Gruppen:
- rancid-$GROUP
- rancid-admin-$GROUP
Bei Postfix kommen die Aliase dafür in die Datei /etc/aliases:
rancid-admin-mamawe: mathias
rancid-mamawe: mathias
Anschließend lade ich die geänderten Aliase:
sudo newaliases
Immer wenn ich eine neue Gruppe hinzufüge,
muss ich mit rancid-cvs
das Repository dafür aufsetzen.
rancid@rancid-test:~$ rancid-cvs
Initialized empty Git repository in /opt/rancid/var/CVS/mamawe/
Cloning into '.'...
warning: You appear to have cloned an empty repository.
done.
[master (root-commit) ba26bc8] new
1 file changed, 3 insertions(+)
create mode 100644 configs/.gitignore
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Writing objects: 100% (4/4), 257 bytes | 257.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To /opt/rancid/var/CVS/mamawe
* [new branch] master -> master
[master f216f9e] new
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 router.db
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 260 bytes | 260.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /opt/rancid/var/CVS/mamawe
ba26bc8..f216f9e master -> master
Die Datei router.db (/opt/rancid/var/mamawe/router.db
)
enthält das Verzeichnis der RANCID bekannten Netzwerkgeräte.
Pro Zeile trage ich hier
- durch Semikolon getrennt -
den Namen, den Gerätetyp sowie den Zustand (up oder down) ein.
Optional kann ich
nach einem weiteren Semikolon
einen Kommentar hinzufügen.
swt01;mikrotik;up
Das Beispiel zeigt einen Switch von MikroTik.
Damit RANCID die Konfigurationen auslesen kann, muss ich ihm die Credentials in der Datei ~/.cloginrc mitteilen. Der Aufbau ist in der Handbuchseite cloginrc(5) beschrieben.
Habe ich nun ein neues Gerät in router.db
und seine Credentials in ~/.cloginrc eingetragen,
kann ich mich zum Test mit plogin
anmelden,
um den neuen Zugang zu testen.
Geht alles glatt,
nehme ich die Konfiguration des neuen Gerätes
durch Aufruf rancid-run
auf.
RANCID versendet eine E-Mail an rancid-admin-mamawe über das hinzugefügte Gerät und dass dessen Zustand zu up gewechselt ist.
Außerdem sendet es eine E-Mail an rancid-mamawe, die die Veränderungen seit dem letzten Programmlauf, in diesem Fall die gesamte Konfiguration enthält.
Als letztes setze ich ein paar Cron-Jobs auf, damit RANCID automatisch und regelmäßig die letzten Konfigurationen abholt.
1 * * * * rancid /opt/rancid/bin/rancid-run
50 23 * * * rancid /usr/bin/find /opt/rancid/var/logs -type f -mtime +2 -exec rm {} \;
Der erste Eintrag sichert geänderte Konfigurationen einmal pro Stunde. Der zweite Eintrag räumt das Verzeichnis mit den Logdateien auf, damit sich dort nicht zu viele veraltete Dateien sammeln.
Damit habe ich die Sicherheit,
dass meine Konfigurationsänderungen automatisch erfasst werden.
Ich kann zwischendurch nach einer Änderung
rancid-run
von Hand aufrufen
und mit der Option -c
eine kurze Beschreibung der Änderung angeben,
die im Log von Git auftaucht
und es leichter macht,
bestimmte Änderungen wiederzufinden.
Außerdem habe ich die Möglichkeit,
mich mittels plogin
auf den Netzgeräten anzumelden
und nach dem Rechten zu sehen.
Git, Gitweb, Webserver
Nun fehlt nur noch eine Möglichkeit, die Änderungen nachzuverfolgen, ohne mich an der Konsole des RANCID-Rechners anmelden zu müssen, sowie ein Backup des Repositories auf einem anderen Rechner.
Für das Nachverfolgen der Änderungen im Webbrowser eignet sich im einfachsten Fall Gitweb, das leicht aufzusetzen ist und für den Lesezugriff ausreicht. Die nachfolgenden Schritte habe ich der Anleitung bei Thomas Krenn entnommen.
sudo apt install apache2 gitweb
Ich setze in /etc/gitweb.conf die Variable *projectroot
:
$projectroot = "/opt/rancid/var";
In /etc/apache2/envvars gebe ich die Gruppe rancid
an,
damit der Webserver die Dateien des Repositories lesen kann:
export APACHE_RUN_GROUP=rancid
Anschließend aktiviere ich das CGI-Modul und starte den Webserver neu:
sudo a2enmod cgid
sudo systemctl restart apache2
Gitweb ist jetzt unter http://rancidserver/gitweb
zu erreichen
und zeigt auf der Startseite die RANCID-Gruppen als Projekte an.
Klicke ich auf ein Projekt, sehe ich zunächst die Zusammenfassung mit einem Auszug des Shortlogs. Darüber sehe ich die Konfigurationsunterschiede aller Netzwerkgeräte von diesem Commit.
Will ich die Änderungen eines einzelnen Gerätes betrachten, folge ich dem Link tree und auf der nächsten Seite dem Link configs. Dort finde ich eine Liste aller Konfigurationsdateien der Gruppe und kann für jede dieser Dateien bei blob deren Inhalt mit Zeilennummern, bei history alle Commits mit Änderungen dieser Datei und bei raw die reine Konfigurationsdatei ansehen.
Für das Backup eines Repositories reicht es normalerweise, dieses auf einem anderen Rechner zu klonen und die Verzeichnisse dort zu sichern. Leider erlaubt Gitweb nicht das Klonen der angezeigten Repositories. Das ist auch nicht unbedingt nötig, weil es reicht, das Verzeichnis .git im Webserver verfügbar zu machen.
Ich ergänze in /etc/apache2/sites/enabled/server.conf das folgende:
Alias /rancid /opt/rancid/var
Anschließend starte ich den Webserver neu.
Außerdem muss ich in den Repositories den folgenden Befehl aufrufen:
git update-server-info
Damit dieser Befehl immer aufgerufen wird, wenn RANCID eine Konfigurationsänderung ablegt, gibt es einen Hook, der das beim Aktualisieren des Repositories erledigt. Diesen kann ich - für jede Gruppe - sehr einfach aktivieren:
cd /opt/rancid/var/$groupname
git update-server-info
mv .git/hooks/post-update.sample .git/hooks/post-update
Damit ich die einzelnen Repositories und deren Adressen leichter finde, lege ich die Datei /opt/rancid/var/index.html an, die eine Liste mit Links zu den Repositories, die ich bekannt machen will, enthält.
Ich kann nun ein Repository
mit git clone https://server/path
klonen
und anschließend mit git pull
regelmäßig die letzten Änderungen auf einen anderen Rechner kopieren.