Netzwerk & IP

Checkmk: Livestatus-Filter in REST-API-Abfragen nutzen

Livestatus und API sind bei Checkmk gut dokumentiert - die Kombination aber nicht

Über die Checkmk-REST-API lässt sich die Konfiguration des Monitorings abfragen und bearbeiten. Über die Livestatus-API gibt es Informationen über den Status des Monitorings. Für die REST-API kommen meist die üblichen HTTP-Tools wie Curl, Httpie oder Python zum Einsatz, für Livestatus gibt es die Checkmk-interne Livestatus Query Language und das Tool lq. Aber man kann auch kombinieren!

Ein typischer Fall für die REST-API: Welche Hosts sind konfiguriert? Eine simple curl-Abfrage kann alle Hosts ausgeben. Oder auch alle Konfigurationsdaten eines einzelnen Hosts.

Ein typischer Fall für Livestatus: Welche Hosts sind gerade in einer Wartungszeit? Eine lq-Abfrage kann entsprechend filtern.

Ein simpler Fall für die Kombination aus REST-API + Livestatus: Zeige alle Hosts, die "localhost" im Namen beinhalten.

Die automatische REST-API-Doku beschränkt sich leider auf folgenden Hinweis: "The endpoints in the category "Monitoring" support arbitrary Livestatus expressions (including And, Or combinators) and all columns of some specific tables can be queried."

Soll heißen: Die REST-API-Endpunkte in der Kategorie "Monitoring", also zum Beispiel "Host status" oder "Metrics", vertragen Livestatus-Ausdrücke, die etwa zum Filtern genutzt werden können. Anders ausgedrückt: Normalerweise nutzt man Livestatus-Abfragen im Terminal über das jq-Werkzeug - man kann sie aber auch in HTTP-Abfragen per zum Beispiel Curl integrieren.

Die Frage ist: Wie genau wird ein Livestatus- in den REST-API-Ausdruck integriert?

Livestatus-Filter in REST-API-Abfragen

Der eigentliche Livestatus-Filter für Hostnamen, die "localhost" (unabhängig von Groß-/Kleinschreibung) beinhalten:

query={"op":"~~","left":"name","right":"Localhost"}
  • op ist der Operator "~~" für den Groß-/Kleinschreibungs-unabhängigen Vergleich per regulärem Ausdruck.
  • left meint den Namen einer Livestatus-Spalte, hier "name" für Hostnamen.
  • right setzt entsprechend den Wert für die Spalte.

Da der Wert in diesem Fall ein regulärer Ausdruck ist, würde zum Beispiel "Localhost$" nur Hosts ausgeben, die auf "Localhost" (oder localhost, localHost etc.) enden.

Eine komplette curl-Abfrage könnte dann inklusive zugehöriger Variablen so aussehen:

HOST_NAME="cmkserver"
SITE_NAME="mysite_24"
API_URL="http://$HOST_NAME/$SITE_NAME/check_mk/api/1.0"
USERNAME="myuser"
PASSWORD="mypassword"

curl -G \
  --request GET \
  -u "$USERNAME:$PASSWORD" \
  --header "Accept: application/json" \
  --data-urlencode 'query={"op":"~~","left":"name","right":"Localhost$"}' \
  "$API_URL/domain-types/host/collections/all" \
| jq

Die Ausgabe wird der Lesbarkeit halber am Ende noch an jq weitergeleitet - mehr zum Aufhübschen von JSON-Ausgaben haben wir hier.

Hier noch ein Beispiel für die Abfrage aller Hosts, die OK sind - per grep reduziert auf die Namen:

curl --request POST \
  --silent \
  --header "Authorization: Bearer $USERNAME $PASSWORD" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --data @- "$API_URL/domain-types/host/collections/all" <<EOF | jq | grep -i name
{
  "columns": [
    "name"
  ],
  "query": "{\"op\": \"and\", \"expr\": [{\"op\": \"=\", \"left\": \"state\", \"right\": \"0\"}]}",
  "sites": [
    "${SITE_NAME}"
  ]
}
EOF

Ergebnis (Auszug):

"name": "tutonaut"
"name": "gizlog"
"name": "localhost"
"name": "localhost_testing"

Wieso dieses Beispiel? Der ganze Kram mit dem Here-Dokument/EOF und den vielen Anführungszeichen soll einfach zeigen, dass es bisweilen etwas frickelig werden kann - und die Beispiele aus der offiziellen, automatischen ReDoc-Doku nicht immer wirklich gut per Copy & Paste funktionieren 😉

Apropos: Wenn die Beispiele oben per Copy & Paste Probleme bereiten, könnte es an Wordpress liegen - dieses elende Teil neigt dazu, Code/Anführungszeichen zu verhunzen ... Hier funktioniert's aber.

Mehr zu Checkmk.

Mirco Lang

Freier Journalist, Exil-Sauerländer, (ziemlich alter) Skateboarder, Dipl.-Inf.-Wirt, Einzelhandelskaufmann, Open-Source-Nerd, Checkmk-Handbuchschreiber. Ex-Saturn'ler, Ex-Data-Becker'ler, Ex-BSI'ler. Computer-Erstkontakt: ca. 1982 - der C64 des großen Bruders eines Freunds. Wenn Ihr hier mehr über Open Source, Linux und Bastelkram lesen und Tutonaut unterstützen möchtet: Über Kaffeesponsoring via Paypal.freue ich mich immer. Schon mal im Voraus: Danke! Nicht verpassen: cli.help und VoltAmpereWatt.de. Neu: Mastodon

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Schaltfläche "Zurück zum Anfang"