# Eigene Checks erstellen

# Einleitung. Muss es immer ein echtes Plugin sein?

Beschreibung:

Checkmk umfasst fast 2.000 fertige Checkplugins für alle nur denkbare Hardware und Software. Diese werden vom Checkmk-Team gepflegt, und jede Woche kommen neue dazu. Daneben gibt es auf der [Checkmk Exchange](https://exchange.checkmk.com) weitere Plugins, die von unseren Anwendern beigesteuert werden.

Und trotzdem gibt es immer wieder Situationen, in denen ein Gerät, eine Anwendung oder einfach nur eine bestimmte Metrik, die für Sie wichtig ist, noch von keinem dieser Plugins erfasst ist — vielleicht auch einfach deshalb, weil es sich dabei um etwas handelt, dass in Ihrer Firma entwickelt wurde und es daher niemand anders haben kann.

<table class="table-responsive table-bordered table tableblock frame-all grid-all spread" id="bkmrk-methode-so-geht%E2%80%99s-vo"><thead><tr><th class="tableblock halign-left valign-top">Methode</th><th class="tableblock halign-left valign-top">So geht’s</th><th class="tableblock halign-left valign-top">Vorteile</th><th class="tableblock halign-left valign-top">Nachteile</th></tr></thead><tbody><tr><td class="tableblock halign-left valign-top">Lokaler Check

</td><td class="tableblock halign-left valign-top">Checkmk-Agent um einfaches Skript erweitern

</td><td class="tableblock halign-left valign-top">Geht sehr einfach, ist in allen Programmiersprachen möglich, welche das Betriebssystem des überwachten Hosts anbietet, unterstützt sogar Serviceerkennung

</td><td class="tableblock halign-left valign-top">Konfiguration der Schwellwerte nur beim Agenten selbst, für komplexere Dinge unkomfortabel, keine Unterstützung für SNMP

</td></tr><tr><td class="tableblock halign-left valign-top">Nagios-kompatibles Checkplugin

</td><td class="tableblock halign-left valign-top">Plugin per *MRPE* vom Windows- oder Linux-Agenten aufrufen lassen

</td><td class="tableblock halign-left valign-top">Zugriff auf alle vorhandenen Nagios-Plugins, auch hier freie Wahl der Programmiersprache

</td><td class="tableblock halign-left valign-top">Konfiguration der Schwellwerte nur beim Agenten selbst, Keine SNMP-Unterstützung durch Checkmk, keine Serviceerkennung möglich

</td></tr><tr><td class="tableblock halign-left valign-top">Logmeldungen auswerten

</td><td class="tableblock halign-left valign-top">*Meldungen* überwachen per Event Console

</td><td class="tableblock halign-left valign-top">Keine Entwicklung notwendig sondern nur aufstellen von Regeln in der Event Console

</td><td class="tableblock halign-left valign-top">Geht nur, wenn passende Logmeldungen vorhanden sind, kein gesicherter aktueller Status, kein Erfassen von Metriken, keine konfigurierbaren Schwellwerte

</td></tr><tr><td class="tableblock halign-left valign-top">Echtes Checkmk-Plugin

</td><td class="tableblock halign-left valign-top">Wird in diesem Artikel erklärt

</td><td class="tableblock halign-left valign-top">Fügt sich zu 100% in Checkmk ein, automatische Serviceerkennung, zentrale Konfiguration der Schwellwerte über die grafische Oberfläche, sehr performant, unterstützt SNMP, automatische Host- und Servicelabels möglich, unterstützt HW/SW-Inventur, Unterstützung durch Standardbibliotheken von Checkmk

</td><td class="tableblock halign-left valign-top">Erfordert mehr Einarbeitungszeit sowie Kenntnisse in der Programmsprache Python

</td></tr></tbody></table>

# Lokaler Check

### Skript erstellen

Sie können einen lokalen Check in jeder beliebigen Programmiersprache schreiben, die der Zielhost unterstützt. Das Skript muss so konstruiert sein, dass es pro Check eine Statuszeile ausgibt, die aus vier Teilen besteht. Hier ist ein Beispiel:

```
0 "My service" myvalue=73 My output text which may contain spaces
```

Die vier Teile sind durch Leerzeichen getrennt und haben folgende Bedeutung:

<table class="table-responsive table-bordered table tableblock frame-all grid-all spread" id="bkmrk-beispielwert-bedeutu"><thead><tr><th class="tableblock halign-left valign-top">Beispielwert</th><th class="tableblock halign-left valign-top">Bedeutung</th><th class="tableblock halign-left valign-top">Beschreibung</th></tr></thead><tbody><tr><td class="tableblock halign-left valign-top">`0`

</td><td class="tableblock halign-left valign-top">Status

</td><td class="tableblock halign-left valign-top">Der Zustand des Services wird als Ziffer angegeben: `0` für <span class="state0">OK</span>, `1` für <span class="state1">WARN</span>, `2` für <span class="state2">CRIT</span> und `3` für <span class="state3">UNKNOWN</span>. Alternativ ist es möglich, den [Status dynamisch berechnen](https://docs.checkmk.com/latest/de/localchecks.html#dynamic_state) zu lassen: dann wird die Ziffer durch ein `P` ersetzt.

</td></tr><tr><td class="tableblock halign-left valign-top">`My service`

</td><td class="tableblock halign-left valign-top">Service-Name

</td><td class="tableblock halign-left valign-top">Der Name des Services, wie er in Checkmk angezeigt wird, in der Ausgabe des Checks in doppelten Anführungszeichen. Falls der Service-Name keine Leerzeichen enthält, können Sie sich die Anführungszeichen sparen.

</td></tr><tr><td class="tableblock halign-left valign-top">`myvalue=73;65;75`

</td><td class="tableblock halign-left valign-top">Wert und Metriken

</td><td class="tableblock halign-left valign-top">Metrikwerte zu den Daten. Sie finden im Kapitel zu den [Metriken](https://docs.checkmk.com/latest/de/localchecks.html#metrics) näheres zum Aufbau. Alternativ können Sie ein Minuszeichen setzen, wenn der Check keine Metriken ausgibt.

</td></tr><tr><td class="tableblock halign-left valign-top">`My output text which may contain spaces`

</td><td class="tableblock halign-left valign-top">Statusdetail

</td><td class="tableblock halign-left valign-top">Details zum Status, wie sie in Checkmk angezeigt werden. Dieser Teil kann auch Leerzeichen enthalten.

</td></tr></tbody></table>

Zwischen den einzelnen Teilen der Ausgabe und dem ersten Text des Statusdetails muss immer ein Leerzeichen stehen. Alles danach wird zum Statusdetail gezählt, weswegen dann auch Leerzeichen erlaubt sind.

Wenn Sie wegen einer möglichen Ausgabe unsicher sind, können Sie diese einfach testen, indem Sie ein kleines Skript mit dem Kommando `echo` schreiben. Fügen Sie in das `echo`-Kommando Ihre Ausgabe ein, die Sie testen möchten. Achten Sie darauf, die Anführungszeichen für den Service-Namen mit `\` zu maskieren, damit diese Zeichen nicht vom `echo`-Kommando interpretiert werden:  
Linux:

```
#!/bin/bash
echo "0 \"My 1st service\" - This static service is always OK"
```

Windows:

```
@echo off
echo 0 "My 1st service" - This static service is always OK
```

Beide Skripte führen in der Ausgabe zum gleichen Ergebnis:

```
0 "My 1st service" - This static service is always OK
```

Für Checkmk ist nur diese Ausgabe relevant, nicht wie Sie diese Ausgabe erzeugt haben.

Sie können übrigens beliebig viele Ausgaben in einem Skript erzeugen. Für jede ausgegebene Zeile wird dann ein eigener Service in Checkmk erstellt. Daher sind in der Ausgabe auch keine Zeilenumbruchzeichen erlaubt — es sei denn, sie sind maskiert, zum Beispiel für eine [mehrzeilige Ausgabe](https://docs.checkmk.com/latest/de/localchecks.html#multi-line) in Checkmk.

Wie Sie prüfen, ob das lokale Skript vom Agenten richtig aufgerufen wird, sehen Sie in der [Fehleranalyse](https://docs.checkmk.com/latest/de/localchecks.html#diagnose).

### Skript verteilen

Nachdem das Skript geschrieben ist, können Sie es an die entsprechenden Hosts verteilen. Der Pfad unterscheidet sich je nach Betriebssystem. Eine Liste der Pfade finden Sie in [Dateien und Verzeichnisse](https://docs.checkmk.com/latest/de/localchecks.html#folders_script) weiter unten.

Vergessen Sie nicht, das Skript auf unixoiden Systemen ausführbar zu machen. Der Pfad in dem Beispiel bezieht sich auf Linux:

```
root@linux# chmod +x /usr/lib/check_mk_agent/local/mylocalcheck
```

Wenn Sie die [Agentenbäckerei](https://docs.checkmk.com/latest/de/wato_monitoringagents.html#bakery) nutzen, können Sie das Skript auch regelbasiert verteilen. Mehr zur Regelerstellung erfahren Sie im Kapitel [Verteilung über die Agentenbäckerei](https://docs.checkmk.com/latest/de/localchecks.html#bakery).

### Den Service ins Monitoring aufnehmen

Bei jedem Aufruf des Checkmk-Agenten wird auch der im Skript enthaltene lokale Check ausgeführt und an die Ausgabe des Agenten angehängt. Die [Service-Erkennung](https://docs.checkmk.com/latest/de/wato_services.html#discovery) funktioniert also wie bei anderen Services auch automatisch: