weidner/computer/sysadmin/

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:

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:

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.

Posted 2021-05-11
Tags: