Checkmk
Unsere KI-RichtlinieKI

1. Einleitung

Der Checkmk-Server erreicht Hosts im Pull-Modus üblicherweise über eine TCP-Verbindung auf Port 6556. Unter Linux und Windows lauscht auf diesem Port in den meisten Fällen der Agent Controller, welcher die Agentenausgabe über eine TLS-verschlüsselte Verbindung weiterleitet. In Checkmk Ultimate ist mit dem Push-Modus die zusätzliche Möglichkeit vorhanden, die Übertragungsrichtung zu wählen.

Es gibt jedoch Umgebungen, in denen der Agent Controller nicht verwendet werden kann. Im Legacy-Modus kommt hier ein inetd zum Einsatz, der bei jeder Anfrage das Agentenskript ausführt, die Ausgabe im Klartext überträgt und dann die Verbindung wieder schließt. In vielen Fällen verlangen Sicherheitsrichtlinien den Verzicht auf eine Übertragung von Daten im Klartext oder die Verwendung vorhandener Kommunikationskanäle. So kann ein Angreifer zwar mit den Füllständen von Dateisystemen meist wenig anfangen, aber Prozesstabellen oder Listen von anstehenden Sicherheitsupdates können helfen, Angriffe zielgerichtet vorzubereiten.

Die universelle Methode, um beliebige Transportwege an Checkmk anzudocken, sind die Datenquellprogramme (data source programs). Die Idee ist sehr einfach: Sie übergeben dem Checkmk-Server einen Befehl, mit dem Agentendaten eingeholt werden sollen. Statt den zu überwachenden Host auf Port 6556 zu kontaktieren, führt Checkmk diesen Befehl aus. Checkmk erwartet bei der Ausführung des Befehls Agentendaten auf der Standardausgabe. Die weitere Verarbeitung erfolgt, als stammten die Agentendaten von einem „normalen“ Agenten. Da Datenquellen wie Agentenaufrufe behandelt werden, ist es wichtig, dass Sie per Datenquellprogramm überwachte Hosts in der Setup-GUI mit der Einstellung API integrations if configured, else Checkmk agent oder Configured API integrations and Checkmk agent versehen.

Letztlich kann die Klartextausgabe des Agentenskripts über beliebige Wege transportiert werden — direkt oder indirekt, per Pull oder Push. Hier sind einige Beispiele, mit denen Checkmk-Anwender Daten vom Agenten zum Checkmk-Server bekommen:

  • per E-Mail

  • per HTTP-Zugriff vom Server aus

  • per HTTP-Upload vom Host aus

  • per Zugriff auf eine Datei, die per rsync oder scp vom Host zum Server kopiert wurde

  • per Skript, welches die Daten per HTTP von einem Webdienst abholt

  • per Agentenaufruf via SSH-Tunnel

Wann sollte ich Datenquellprogramme einsetzen, wann Spezialagenten?

Datenquellprogramme und Spezialagenten sind eng miteinander verwandt. Letztlich sind Spezialagenten als Evolution von Datenquellprogrammen zu betrachten. Spezialagenten wurden zunächst genutzt, um Datenquellprogramme besser konfigurierbar zu machen.

Heute liefern Spezialagenten in der Regel eigene Agentensektionen und werden mit eigenen Check-Plugins kombiniert. In der Praxis relevant ist, dass einem Host nur ein Datenquellprogramm zugeordnet sein kann, aber seit Checkmk 2.4.0 beliebig viele Spezialagenten. Auch können Spezialagenten die reguläre Agentenausgabe ergänzen, ein Datenquellprogramm ersetzt sie hingegen.

Wenn Sie also beispielsweise über eine REST-API Daten einholen können, die zusätzlich zur regulären Agentenausgabe einen Nutzen im Monitoring haben, müssen Sie einen Spezialagenten verwenden. Falls Sie eine reguläre Agentenausgabe einfach auf anderen Wegen übertragen wollen, sind Datenquellprogramme der richtige Weg. Und schließlich können Sie jedes Datenquellprogramm — wenn denn einmal eine bessere Konfigurierbarkeit erforderlich sein sollte — in einen Spezialagenten umwandeln.

2. Schreiben von Datenquellprogrammen

2.1. Das einfachste mögliche Programm

Das Schreiben und Einbinden eines eigenen Datenquellprogramms ist nicht schwer. Sie können jede von Linux unterstützte Skript- und Programmiersprache verwenden. Legen Sie das Programm am besten im Verzeichnis ~/local/bin/ an, dann wird es immer automatisch ohne Pfadangabe gefunden.

Das folgende erste minimale Beispiel heißt myds und erzeugt einfache fiktive Monitoring-Daten. Anstatt einen neuen Transportweg zu integrieren, erzeugt es Monitoring-Daten selbst. Diese enthalten als einzige Sektion <<<df>>>, mit der Information zu einem einzigen Dateisystem der Größe 100 kB und dem Namen My_Disk. Das Ganze ist ein Shell-Skript mit drei Zeilen:

~/local/bin/myds
#!/bin/sh
echo '<<<df>>>'
echo 'My_Disk  foobar  100 70 30  70% /my_disk'
Dateiinhalt in die Zwischenablage kopieren
Dateiinhalt erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

Vergessen Sie nicht, Ihr Programm ausführbar zu machen:

OMD[mysite]:~$ chmod +x local/bin/myds
Befehl(e) in die Zwischenablage kopieren
Befehl(e) erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

Legen Sie nun im Setup zum Test einen Host an — z.B. myserver125. Dieser benötigt keine IP-Adresse. Um zu verhindern, dass Checkmk den Namen myserver125 per DNS aufzulösen versucht, setzen Sie IP address family auf No IP.

Legen Sie dann im Regelsatz Setup > Agents > Other integrations > Individual program call instead of agent access eine Regel an, welche für diesen Host gilt, und tragen Sie myds als aufzurufendes Programm ein:

Eingabemaske für einen individuellen Befehl.

Wenn Sie jetzt in der Setup-GUI zur Service-Konfiguration des Hosts wechseln, sollten Sie genau einen Service sehen, der für die Überwachung bereitsteht:

Der neue Service wurde erkannt.

Nehmen Sie diesen in die Überwachung auf, aktivieren Sie die Änderungen und Ihr erstes Datenquellprogramm läuft. Sobald Sie jetzt testweise die Daten ändern, die das Programm auswirft, wird das der nächste Check des Dateisystems My_Disk sofort anzeigen.

2.2. Fehlerdiagnose

Wenn etwas nicht funktioniert, können Sie auf der Befehlszeile mit cmk -D die Konfiguration des Hosts überprüfen und feststellen, ob Ihre Regel greift:

OMD[mysite]:~$ cmk -D myserver125

myserver125
Addresses:              myserver125
Tags:                   [address_family:ip-v4-only], [agent:cmk-agent], [criticality:prod], [ip-v4:ip-v4], [networking:lan], [piggyback:auto-piggyback], [site:mysite], [snmp_ds:no-snmp], [tcp:tcp]
Host groups:            check_mk
Agent mode:             Normal Checkmk agent, or special agent if configured
Type of agent:
Program: myds
Befehl(e) in die Zwischenablage kopieren
Befehl(e) erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

Mit einem cmk -d können Sie den Abruf der Agentendaten — und damit das Ausführen Ihres Programms — auslösen:

OMD[mysite]:~$ cmk -d myserver125
<<<df>>>
My_Disk  foobar  100 70 30  70% /my_disk
Befehl(e) in die Zwischenablage kopieren
Befehl(e) erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

Ein doppeltes -v sollte eine Meldung erzeugen, dass Ihr Programm aufgerufen wird:

OMD[mysite]:~$ cmk -vvd myserver125
Calling: myds
<<<df>>>
My_Disk  foobar  100 70 30  70% /my_disk
Befehl(e) in die Zwischenablage kopieren
Befehl(e) erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

2.3. Übergeben des Host-Namens

Das Programm aus dem ersten Beispiel funktioniert zwar, ist aber nicht sehr praxistauglich, denn es gibt immer die gleichen Daten aus, egal für welchen Host es aufgerufen wird.

Ein echtes Programm, dass z.B. per HTTP von irgendwoher Daten holt, benötigt dazu zumindest den Namen des Hosts, für den Daten geholt werden sollen. Sie können diesen in der Befehlszeile mit dem Platzhalter $HOSTNAME$ übergeben lassen:

Übergabe des Host-Namens mit dem Makro $HOSTNAME$.

In diesem Beispiel bekommt das Programm myds den Host-Namen als erstes Argument geliefert. Folgendes Beispielprogramm gibt diesen zum Testen in Form eines lokalen Checks aus. Es greift per $1 auf das erste Argument zu und speichert es zum Zwecke der Übersicht in der Variable $HOST_NAME. Diese wird dann in die Plugin-Ausgabe des lokalen Checks eingesetzt:

~/local/bin/myds
#!/bin/sh
HOST_NAME="$1"

echo '<<<local>>>'
echo "0 Hostname - My name is ${HOST_NAME}"
Dateiinhalt in die Zwischenablage kopieren
Dateiinhalt erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

Die Service-Erkennung wird jetzt einen neuen Service vom Typ local finden, in dessen Ausgabe der Host-Name zu sehen ist:

Die Service-Erkennung findet den neuen Service, der nun den übergebenen Host-Namen als Information ausgibt.

Der Schritt zu einem echten Datenquellprogramm, das z.B. Daten per HTTP mit dem Befehl curl holt, ist jetzt nicht mehr weit. Folgende Platzhalter sind in der Befehlszeile der Datenquellprogramme erlaubt:

$HOSTNAME$

Der Host-Name, wie er im Setup konfiguriert ist.

$HOSTADDRESS$

Diejenige IP-Adresse des Hosts, über die er überwacht wird.

$_HOSTTAGS$

Die Liste aller Host-Merkmale durch Leerzeichen getrennt. Setzen Sie dieses Argument auf jeden Fall in Anführungszeichen, um es vor einem Aufteilen durch die Shell zu schützen.

Falls Sie den Host dual per IPv4 und IPv6 überwachen, sind unter Umständen noch folgende Makros für Sie interessant:

$_HOSTADDRESS_4$

Die IPv4-Adresse des Hosts

$_HOSTADDRESS_6$

Die IPv6-Adresse des Hosts

$_HOSTADDRESS_FAMILY$

Die Ziffer 4, wenn die zur Überwachung genutzte Adresse die IPv4-Adresse ist, ansonsten 6.

2.4. Fehlerbehandlung

Egal, welchen Beruf Sie in der IT ausüben — den meisten Teil Ihrer Zeit werden Sie sich mit Fehlern und Problemen befassen. Und auch Datenquellprogramme bleiben davon nicht verschont. Vor allem bei Programmen, die per Netzwerk Daten beschaffen, ist ein Fehler keineswegs unrealistisch.

Damit Ihr Programm Checkmk so einen Fehler sauber mitteilen kann, gilt Folgendes:

  1. Jeder Exit Code außer 0 wird als Fehler gewertet.

  2. Fehlermeldungen werden auf dem Standardfehlerkanal (stderr) erwartet.

Falls ein Datenquellprogramm scheitert,

  • verwirft Checkmk die kompletten Nutzdaten der Ausgabe,

  • setzt den Service Check_MK auf CRIT und zeigt dort die Daten von stderr als Fehler an,

  • bleiben die eigentlichen Services auf dem alten Stand (und werden mit der Zeit veralten).

Sie können das Beispiel von oben so modifizieren, dass es einen Fehler simuliert. Mit der Umleitung >&2 wird der Text auf stderr gelenkt. Und exit 1 setzt den Exit Code des Programms auf 1:

~/local/bin/myds
#!/bin/sh
HOST_NAME=$1

echo "<<<local>>>"
echo "0 Hostname - My name is $HOST_NAME"

echo "This didn't work out" >&2
exit 1
Dateiinhalt in die Zwischenablage kopieren
Dateiinhalt erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

Im Service Check_MK sieht dies dann so aus:

Wenn ein Skript von 0 verschiedene Exit Codes liefert, wird der Service 'Check_MK' sofort CRIT (rot).

Falls Sie Ihr Programm als Shell-Skript schreiben, können Sie gleich am Anfang die Option set -e verwenden:

~/local/bin/myds
#!/bin/sh
set -e
Dateiinhalt in die Zwischenablage kopieren
Dateiinhalt erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

Sobald ein Befehl fehlschlägt (Exit Code ungleich 0), bricht die Shell sofort ab und beendet das Skript mit dem Exit Code 1. Damit haben Sie eine generische Fehlerbehandlung und müssen nicht bei jedem einzelnen Befehl auf Erfolg prüfen.

3. Dateien und Verzeichnisse

Pfad Bedeutung

~/local/bin/

Ablage von eigenen Programmen oder Skripten, die im Suchpfad sein sollen und ohne Pfadangabe direkt ausgeführt werden können. Ist ein Programm sowohl in ~/bin/ als auch in ~/local/bin/, hat letzteres Vorrang.


Letzte Änderung: Wed, 05 Aug 2026 13:19:55 GMT via Commit 7c6d53541
Auf dieser Seite