ADMIN

2025

03

2025-02-27T12:00:00

Monitoring und Hochverfügbarkeit

SCHWERPUNKT

070

Monitoring

Servervalidierung mit Goss

Schnelltest

von Markus Stubbig

Veröffentlicht in Ausgabe 03/2025 - SCHWERPUNKT

Die Server laufen, aber ist mit ihnen auch wirklich alles in Ordnung? Ohne ein ausgewachsenes Monitoringsystem bemühen zu müssen, lassen sich Server mit Goss im Eilverfahren prüfen und ein schneller Statusbericht zum Wohlbefinden der Maschine abrufen. Und falls Werkzeuge wie etwa Nagios bereits im Einsatz sind, erlaubt dies, die Prüfergebnisse von Goss damit auswerten. Unser Workshop zeigt die Inbetriebnahme des freien Tools sowie verschiedene Checks für Linux- und Windows-Rechner.

Goss [1] bezeichnet sich als "Quick and easy server validation" und beschreibt seine Funktion damit äußerst präzise. Die Konfiguration ist ein Klacks und die Prüfungen sind meist innerhalb einer Sekunde abgeschlossen. Der finanzielle Aufwand ist aufgrund der Apache-Open-Source-Lizenz unschlagbar. Aber mehr als Unit Testing (auch Modultests oder Komponententests genannt) bietet die Software nicht an. Schlägt somit ein Check fehl, muss der Admin vertiefende Ursachenforschung betreiben.
Seit fast zehn Jahren testet Goss Linux-Systeme und die Unterstützung für Win-dows kam 2020 hinzu. Doch diese hat noch einige Einschränkungen – dazu später mehr. In Docker führt Goss seine Checks innerhalb des Containers durch und gibt sein Statement ab. Goss ist nicht die erste Software dieser Art und betrachtet sich als Alternative zu Serverspec, einem Tool, das zwar vielseitiger, aber auch komplexer zu konfigurieren ist als Goss.
Goss in Betrieb nehmen
Der "goss"-Befehl ist alles, was Sie für einen Servercheck benötigen. Mit goss validate oder goss v werfen Sie einen Blick in die Konfigurationsdatei "goss.yaml" und überprüfen, was dort formuliert ist. Für den ungeduldigen Admin zeigen wir im nächsten Abschnitt die Funktion "autoadd", um die Konfigurationsdatei mit Routineaufgaben zu befüllen.
Goss [1] bezeichnet sich als "Quick and easy server validation" und beschreibt seine Funktion damit äußerst präzise. Die Konfiguration ist ein Klacks und die Prüfungen sind meist innerhalb einer Sekunde abgeschlossen. Der finanzielle Aufwand ist aufgrund der Apache-Open-Source-Lizenz unschlagbar. Aber mehr als Unit Testing (auch Modultests oder Komponententests genannt) bietet die Software nicht an. Schlägt somit ein Check fehl, muss der Admin vertiefende Ursachenforschung betreiben.
Seit fast zehn Jahren testet Goss Linux-Systeme und die Unterstützung für Win-dows kam 2020 hinzu. Doch diese hat noch einige Einschränkungen – dazu später mehr. In Docker führt Goss seine Checks innerhalb des Containers durch und gibt sein Statement ab. Goss ist nicht die erste Software dieser Art und betrachtet sich als Alternative zu Serverspec, einem Tool, das zwar vielseitiger, aber auch komplexer zu konfigurieren ist als Goss.
Goss in Betrieb nehmen
Der "goss"-Befehl ist alles, was Sie für einen Servercheck benötigen. Mit goss validate oder goss v werfen Sie einen Blick in die Konfigurationsdatei "goss.yaml" und überprüfen, was dort formuliert ist. Für den ungeduldigen Admin zeigen wir im nächsten Abschnitt die Funktion "autoadd", um die Konfigurationsdatei mit Routineaufgaben zu befüllen.
Die Goss-Binärdatei wartet bei GitHub auf ihren Einsatz. Laden Sie das File auf Ihren Windows- oder Linux-Rechner. Das erledigen Sie mit einem beliebigen Webbrowser oder auf der Kommandozeile am Beispiel von Linux wie folgt:
curl --location --output /usr/bin/goss https://github.com/goss-org/goss/releases/download/v0.4.9/goss-linux-amd64
chmod +x /usr/bin/goss
Unter Windows funktioniert das ähnlich, da das curl-Kommando seit Windows 10 zum Standardumfang gehört:
curl --location --output %LOCALAPPDATA%\Microsoft\WindowsApps\goss.exe https://github.com/goss-org/goss/releases/download/v0.4.9/goss-windows-amd64.exe
Hat die Installation geklappt, zeigt Ihnen dies ein einfaches goss -v und Sie erhalten so auch gleich die Versionsnummer der neuen Software. Eine grafische Oberfläche gibt es nicht, auch nicht unter Windows.
Auto-Konfiguration nutzen
Einige Checks kann Goss selbstständig zusammenstellen und in seine Konfigurationsdatei eintragen. Dazu gehören Linux-Dienste wie SSH und der Apache HTTPD-Server. Dafür generiert Goss aber keine statische Konfiguration, sondern komponiert die YAML-Zeilen passend zum Linux-Host. Beispielsweise entsteht eine angepasste Checkliste für die Datenbank MongoDB mit dem Goss-Befehl goss autoadd mongod. Dieser fügt den TCP-Port 27017, den Dienst MongoD, den Service-User, die Gruppe und den Prozess hinzu.
Benötigen Sie nicht alle Komponenten, können Sie mit einzelnen add-Kommandos gezielter vorgehen:
goss add service mongod
goss add user mongod
goss add port 27017
Ein Blick in die Datei "goss.yaml" zeigt in einigermaßen lesbarer Form, was Goss zusammengestellt hat. Der erste Befehl füllt die Konfigurationsdatei mit einem port-Kommando und den dazugehörigen Optionen. Damit soll Goss prüfen, ob ein Programm den TCP-Port 27017 bedient:
port:
    tcp:27017:
        listening: true
        ip:
            - 127.0.0.1
Manuelle Eingriffe in die goss.yaml-Datei sind möglich, zusätzlich liefert die Dokumentation [2] weitere Optionen, um eigene Befehle einzufügen, die Namensauflösung zu überprüfen oder Kernel-Para- meter abzufragen. Unter Windows sind viele Methoden noch nicht implementiert, aber mit jeder Version kommen neue hinzu.
Checks per Hand und via Skript
Die ersten Checks sind fertig und Goss kann nun mit seinen Prüfungen loslegen. Diese treten Sie per goss validate los, sehen daraufhin ein paar Zeilen über den Bildschirm huschen und nach wenigen Millisekunden steht das Ergebnis fest. Ein erfolgreiches Gesamtergebnis zeigt sich in grüner Schrift. Bei fehlerhaften Tests hebt die Software rot hervor, welche Komponente vom Sollzustand abweicht.
Bild 1: Wenn es etwas ausführlicher sein soll, verrät Goss zu jedem Check seine Erwartungshaltung sowie Punkte, die schiefgelaufen sind.
Um bei einem SSH-Login automatisch das Feedback des goss-validate-Befehls zu erhalten, müssen Sie den validate-Befehl in Ihrer persönlichen ".profile"-Datei eintragen. Damit gibt Goss seinen Senf nur beim interaktiven Login dazu und nicht beim Datentransfer über SCP oder vor einem "git push" per SSH.
Doch nicht alle Zustände unter Linux lassen sich mit den Bordmitteln von Goss abfragen. Beispielsweise erkennt das Tool, ob der MariaDB-Prozess läuft und auf einem bestimmten Netzwerkport horcht. Das ist aber noch kein eindeutiges Zeichen dafür, dass die Datenbank zuverlässig arbeitet. Feinere Checks lassen sich als externes Kommando oder Skript dazubauen und von Goss ausführen. Sobald das externe Kommando abgearbeitet ist, behält Goss den Exitcode und die Programmausgabe im Blick. Zeigt der Exitcode den erwarteten Wert und weist die Ausgabe das gewünschte Muster auf, gilt der Aufruf als erfolgreich.
Im Listing-Kasten prüft Goss verschiedene Dienste mit fachspezifischen Befehlen. Ein SELECT-Kommando holt einen Wert aus MariaDB und vergleicht ihn mit einer festen Zeichenkette. Danach kommt die Suchmaschine Sphinx an die Reihe. Hier erkennt die Software an der Ausgabe von "check passed", dass der Indexer erfolgreich war. Zuletzt schaut sich unser Werkzeug einen privaten Schlüssel an und vergleicht die Länge per Regex mit akzep- tablen Werten. Dabei ist stets zu beachten, dass die Kommandos ohne Passworteingabe auskommen müssen. Haben Sie dabei im Hinterkopf, dass sich bei bestimmten externen Skripten die von uns zuvor angepriesene Ausführungszeit deutlich verlangsamen kann. Wenn das Skript erst ausgiebig mit der Datenbank flirtet, wird Goss nicht nach wenigen Millisekunden sein Gesamtergebnis verkünden.
Listing: Erster Check mit Goss
Goss ruft beliebige Kommandos oder Skripte auf und prüft anschließend den Exitcode und die Befehlsausgabe.
command:
    mariadb:
        exit-status: 0
        exec: mysql cacti -s <<<'SELECT hostname FROM host WHERE id=1;'
        stdout:
        - localhost
    searchd index:
        exit-status: 0
        exec: /usr/bin/indextool --check note1
        stdout:
        - "check passed"
    private key length:
        exit-status: 0
        exec: "openssl rsa -in /www/tls/priv.key -text"
        stdout:
        - "/Private-Key: \\((2048|3072|4096) bit/"
Remote testen
Goss prüft jedoch nicht nur die lokale Maschine, sondern kann auch andere Server im Netzwerk ansprechen. Die addr-Methode versucht eine TCP-Verbindung zu einem fernen Host herzustellen – vergleichbar mit telnet. Beim dns-Test absolviert das Tool eine Namensauflösung gegen einen beliebigen DNS-Server (vergleichbar mit nslookup und dig). Nur wenn der Dienst erreichbar ist und die gewünschte Antwort liefert, verbucht Goss den Test als erfolgreich.
Bei einem Webserver lässt sich mit dem http-Test nicht nur die Verfügbarkeit, sondern auch Header und Body auf bestimmte Inhalte prüfen. Der Ablauf ähnelt den Tools curl und wget. Damit validiert Goss auch den Zugriff auf eine HTTP-API. Beispielsweise übergibt die Anwendung eine IPv4-Adresse an die Webseite des API und erwartet die korrekte geografische Zuordnung; hier ein Beispiel:
http:
    geoip-api:
        status: 200
        url: http://geoip.
      example.net/1.2.3.4
        body:
        - Australia
Bemerkenswert ist allerdings, dass es keinen Test gibt, der äquivalent zu ping ein simples ICMP-Echo-Paket aussendet.
Zusammenspiel mit Nagios & Co.
Goss ist zwar ein Einzelgänger, integriert sich aber gut mit anderen Werkzeugen des Monitorings. Über den "--format"-Schalter gestalten Sie die Ergebnisse so, dass Nagios oder Prometheus diese verstehen. In Bild 1 hat Goss einen fehlerhaften Dienst aufgedeckt und im Format "documentation" farblich hervorgehoben. Hilfreich ist auch die Ausgabe im JSON-Format. Diese ist zunächst unübersichtlich, da Goss alle Informationen ohne Zeilenumbruch ausspuckt. Doch mit jq bändigen Sie das Chaos und picken sich einzelne Werte heraus.
Für den Fernzugriff hat Goss einen Mini-Webserver im Bauch. Mit goss serve stellt das Tool seine Erkenntnisse über TCP-Port 8080 im Netz bereit. Ein Monitoringsystem kann an "http://server:8080/healthz" herantreten und die Ergebnisse abfragen. Zusätzlich zur optischen Anzeige liefert der Goss-Server bei erfolgreichen Checks den HTTP-Statuscode "200" zurück. Wenn mindestens eine Prüfung auf Fehler läuft, lautet die Code-Antwort "503".
Parallele Checks
Gossboss ist ein weiteres Werkzeug im Goss-Ökosystem. Es handelt sich dabei um einen Befehl, der mehrere Goss-Instanzen aufruft und deren Status übersichtlich in der Kommandozeile darstellt. Das Tool kommt vorkompiliert als Tarball von GitHub [4]. Die Installation nutzt dieselben Schritte wie bei Goss.
Für die angesprochene Funktionalität macht sich Gossboss die serve-Funktion zunutze. Da Gossboss die Ausgabe im JSON-Format benötigt, muss Goss auf den involvierten Servern als "goss serve --format json" laufen. Anschließend bittet der Boss seine Mitarbeiter nacheinander zum Rapport:
gossboss healthzs \
    --servers "http://roc-sv-72-r:8080/healthz" \
    --servers "http://dis-sx-01-d:8080/healthz" \
    --servers "http://teg-sv-09-b:8080/healthz"
Daraufhin liefert er ein Ergebnis, das so aussehen könnte:
✔ http://dis-sx-01-d:8080/healthz
✘ http://roc-sv-72-r:8080/healthz
✔ http://teg-sv-09-b:8080/healthz
Error: Goss test failed
Auch Container im Blick
Goss prüft nicht nur den Host, sondern auch seine Gäste, die in Containern stecken. Das notwendige Kommando "dgoss" stammt vom selben Anbieter und installiert sich wie gewohnt [3]. Zudem erwartet der Befehl ebenfalls eine Checkdatei im YAML-Format sowie ein Docker-Image. Anschließend startet dgoss einen Container, arbeitet seine Checkliste ab, stoppt den Container und präsentiert die Ergebnisse (Bild 2). Damit überprüfen Sie die Funktionalität des Docker-Images und nicht eines bereits laufenden Containers.
Bild 2: Mit der Variante dgoss lassen sich Docker-Container prüfen.
Nach dem gleichen Schema funktioniert "dcgoss", das sich an Docker-Compose-Umgebungen richtet. Und "kgoss" bringt Goss in die Pods von Kubernetes.
Security
Goss prüft nicht nur, ob bestimmte Dateien vorhanden sind und Dienste laufen, sondern beherrscht auch das Gegenteil. Ist beispielsweise Sendmail in der Firma unerwünscht, dann kann Goss validieren, dass kein Paket dieses Namens installiert ist und kein Prozess mit sendmail im Titel läuft. Tiefgreifende Sicherheitsaudits sind mit Goss zwar möglich, aber aufwendig. Hier führen Tools wie Lynis schneller zum Ziel.
Fazit
Goss prüft Server im Schnellverfahren. Die einzelnen Checks lassen sich im YAML-Format anlegen und damit Dateien, Prozesse, Netzwerkports, Dienste und Kernelparameter prüfen. Hilfreich ist Goss für den schnellen Check vor einer geplanten Konfigurationsänderung und nach einem Update. Das Tool kann die Ergebnisse für Nagios formulieren und sich somit bei einem Monitoringsystem einklinken. Damit wird Goss aber nicht zu einem ausgewachsenen Monitoring, denn dazu fehlt beispielsweise die Möglichkeit, einen fehlerhaften Dienst automatisch neu zu starten.
(jp)
Link-Codes