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
rsyncoderscpvom Host zum Server kopiert wurdeper Skript, welches die Daten per HTTP von einem Webdienst abholt
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:
Vergessen Sie nicht, Ihr Programm ausführbar zu machen:
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:

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:

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:
Mit einem cmk -d können Sie den Abruf der Agentendaten — und damit das Ausführen Ihres Programms — auslösen:
Ein doppeltes -v sollte eine Meldung erzeugen, dass Ihr Programm aufgerufen wird:
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:

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:
Die Service-Erkennung wird jetzt einen neuen Service vom Typ local finden, in dessen Ausgabe der Host-Name zu sehen ist:

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:
|
Der Host-Name, wie er im Setup konfiguriert ist. |
|
Diejenige IP-Adresse des Hosts, über die er überwacht wird. |
|
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:
|
Die IPv4-Adresse des Hosts |
|
Die IPv6-Adresse des Hosts |
|
Die Ziffer |
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:
Jeder Exit Code außer
0wird als Fehler gewertet.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
stderrals 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:
Im Service Check_MK sieht dies dann so aus:

Falls Sie Ihr Programm als Shell-Skript schreiben, können Sie gleich am Anfang die Option set -e verwenden:
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 |
|---|---|
|
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 |
