diff --git a/README.md b/README.md index b938fae..08f46bd 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,19 @@ -# Checkmk Local Check: Docker Container Status +# Checkmk Local Checks: Docker Monitoring -Checkmk Local Check zur Überwachung von Docker-Containern per `docker ps`. +Zwei Checkmk Local Checks zur Überwachung von Docker-Containern. -## Funktionsweise +| Script | Zweck | +|---|---| +| `docker_container_check.sh` | Prüft ob Container laufen | +| `docker_file_check.sh` | Prüft ob Dateien/Verzeichnisse in Containern existieren | -Das Script prüft für jeden konfigurierten Container den Status: +--- + +## 1. Container Status Check (`docker_container_check.sh`) + +Prüft per `docker ps` ob die angegebenen Container laufen. + +### Status-Mapping | Container-Status | Checkmk-Status | |---|---| @@ -14,57 +23,103 @@ Das Script prüft für jeden konfigurierten Container den Status: | Container nicht gefunden | CRITICAL (2) | | Keine Docker-Berechtigung | CRITICAL (2) | -## Konfiguration +### Konfiguration -In der Datei `docker_container_check.sh` gibt es zwei Variablen. Je nachdem ob der Container-Name oder die Container-ID bekannt ist, die passende Variable befüllen (oder beide): +In der Datei `docker_container_check.sh` die Variable `CONTAINERS` anpassen. Namen und IDs können gemischt werden: ```bash -# Ueberwachung per Container-Name: -CONTAINER_NAMES="webserver,database,redis" - -# Ueberwachung per Container-ID: -CONTAINER_IDS="a1b2c3d4e5f6,f6e5d4c3b2a1" +CONTAINERS="webserver,a1b2c3d4e5f6,redis" ``` -Die Container-ID findet man per `docker ps -a --format '{{.ID}} {{.Names}}'`. -Beide Variablen können gleichzeitig genutzt werden. +### Test + +```bash +/usr/lib/check_mk_agent/local/docker_container_check.sh +``` + +``` +0 Docker_webserver - webserver: Up 3 hours +0 Docker_database - database: Up 3 hours +2 Docker_redis - redis: Exited (1) 5 minutes ago +``` + +--- + +## 2. File/Directory Check (`docker_file_check.sh`) + +Prüft per `docker exec ... test -e` ob Dateien oder Verzeichnisse in Containern existieren. Erkennt automatisch ob es eine Datei oder ein Verzeichnis ist. + +### Status-Mapping + +| Status | Checkmk-Status | +|---|---| +| Pfad existiert (Datei oder Verzeichnis) | OK (0) | +| Pfad fehlt | CRITICAL (2) | +| Container läuft nicht | CRITICAL (2) | +| Keine Docker-Berechtigung | CRITICAL (2) | + +### Konfiguration + +In der Datei `docker_file_check.sh` das Array `CHECKS` anpassen. Format pro Zeile: + +``` +CONTAINER_NAME_ODER_ID:PFAD1,PFAD2,PFAD3 +``` + +Beispiel: + +```bash +CHECKS=( + "webserver:/etc/nginx/nginx.conf,/var/log/nginx,/usr/share/nginx/html/index.html" + "database:/var/lib/mysql/data,/etc/my.cnf" + "e650d85ff452:/root/db.sql,/data" +) +``` + +- Vor dem Doppelpunkt steht der Container-Name oder die ID +- Nach dem Doppelpunkt die zu prüfenden Pfade, kommagetrennt +- Jeder Container bekommt eine eigene Zeile +- Dateien und Verzeichnisse können gemischt angegeben werden + +### Test + +```bash +/usr/lib/check_mk_agent/local/docker_file_check.sh +``` + +``` +0 Docker_File_webserver__etc_nginx_nginx_conf - Datei /etc/nginx/nginx.conf existiert in webserver +0 Docker_File_webserver__var_log_nginx - Verzeichnis /var/log/nginx existiert in webserver +2 Docker_File_database__root_db_sql - /root/db.sql fehlt in database +``` + +--- ## Installation -1. Script auf den Zielhost kopieren: +Beide Scripts gleich installieren: + +1. Auf den Zielhost kopieren: ```bash -scp docker_container_check.sh user@host:/usr/lib/check_mk_agent/local/ +scp docker_container_check.sh docker_file_check.sh user@host:/usr/lib/check_mk_agent/local/ ``` 2. Ausführbar machen: ```bash chmod +x /usr/lib/check_mk_agent/local/docker_container_check.sh +chmod +x /usr/lib/check_mk_agent/local/docker_file_check.sh ``` 3. Sicherstellen, dass der Checkmk-Agent-Benutzer Docker-Befehle ausführen darf (Mitglied der Gruppe `docker` oder Ausführung via `sudo`). -4. In Checkmk eine Service-Erkennung auf dem Host durchführen — die neuen Services `Docker_` erscheinen automatisch. +4. In Checkmk eine Service-Erkennung auf dem Host durchführen — die neuen Services erscheinen automatisch. -## Test +## Allgemeine Hinweise -Manuell auf dem Host ausführen: - -```bash -/usr/lib/check_mk_agent/local/docker_container_check.sh -``` - -Erwartete Ausgabe: - -``` -0 Docker_webserver - Up 3 hours -0 Docker_database - Up 3 hours -2 Docker_redis - Exited (1) 5 minutes ago -``` - -## Hinweise - -- Das Script prüft vor der Ausführung ob Docker-Rechte vorhanden sind. Falls nicht, wird ein CRITICAL-Service `Docker_Check` mit dem Hinweis "Keine Berechtigung" erzeugt. +- Die Container-ID findet man per `docker ps -a --format '{{.ID}} {{.Names}}'`. +- Beide Scripts prüfen vor der Ausführung ob Docker-Rechte vorhanden sind. +- Der File Check benötigt einen **laufenden** Container (`docker exec`). Gestoppte Container werden als CRITICAL gemeldet. - Der Plugin-Pfad kann je nach Installation variieren (`/usr/lib/check_mk_agent/local/` oder `/usr/local/lib/check_mk_agent/local/`). -- Falls der Agent als `root` läuft, funktioniert `docker ps` direkt. Andernfalls muss der Agent-Benutzer in der Gruppe `docker` sein. +- Falls der Agent als `root` läuft, funktioniert `docker` direkt. Andernfalls muss der Agent-Benutzer in der Gruppe `docker` sein. diff --git a/README_file_check.md b/README_file_check.md new file mode 100644 index 0000000..22074db --- /dev/null +++ b/README_file_check.md @@ -0,0 +1,75 @@ +# Checkmk Local Check: Docker File/Directory Check + +Checkmk Local Check zur Prüfung ob Dateien oder Verzeichnisse in Docker-Containern existieren. + +## Funktionsweise + +Das Script prüft per `docker exec ... test -e` ob ein Pfad im Container vorhanden ist. Es erkennt automatisch ob es sich um eine Datei oder ein Verzeichnis handelt. + +| Status | Checkmk-Status | +|---|---| +| Pfad existiert (Datei oder Verzeichnis) | OK (0) | +| Pfad fehlt | CRITICAL (2) | +| Container läuft nicht | CRITICAL (2) | +| Keine Docker-Berechtigung | CRITICAL (2) | + +## Konfiguration + +In der Datei `docker_file_check.sh` das Array `CHECKS` anpassen. Format pro Zeile: + +``` +CONTAINER_NAME:PFAD1,PFAD2,PFAD3 +``` + +Beispiel: + +```bash +CHECKS=( + "webserver:/etc/nginx/nginx.conf,/var/log/nginx,/usr/share/nginx/html/index.html" + "database:/var/lib/mysql/data,/etc/my.cnf" + "app:/root/db.sql,/data,/root/config.yml" +) +``` + +- Vor dem Doppelpunkt steht der Container-Name +- Nach dem Doppelpunkt die zu prüfenden Pfade, kommagetrennt +- Jeder Container bekommt eine eigene Zeile +- Dateien und Verzeichnisse können gemischt angegeben werden + +## Installation + +1. Script auf den Zielhost kopieren: + +```bash +scp docker_file_check.sh user@host:/usr/lib/check_mk_agent/local/ +``` + +2. Ausführbar machen: + +```bash +chmod +x /usr/lib/check_mk_agent/local/docker_file_check.sh +``` + +3. In Checkmk eine Service-Erkennung auf dem Host durchführen. + +## Test + +Manuell auf dem Host ausführen: + +```bash +/usr/lib/check_mk_agent/local/docker_file_check.sh +``` + +Erwartete Ausgabe: + +``` +0 Docker_File_webserver__etc_nginx_nginx_conf - Datei /etc/nginx/nginx.conf existiert in webserver +0 Docker_File_webserver__var_log_nginx - Verzeichnis /var/log/nginx existiert in webserver +2 Docker_File_app__root_db_sql - /root/db.sql fehlt in app +``` + +## Hinweise + +- Der Container muss **laufen**, damit `docker exec` funktioniert. Gestoppte Container werden als CRITICAL gemeldet. +- Das Script prüft vor der Ausführung ob Docker-Rechte vorhanden sind. +- Der Plugin-Pfad kann je nach Installation variieren (`/usr/lib/check_mk_agent/local/` oder `/usr/local/lib/check_mk_agent/local/`). diff --git a/docker_container_check.sh b/docker_container_check.sh index e6c29b8..91f11ee 100755 --- a/docker_container_check.sh +++ b/docker_container_check.sh @@ -12,10 +12,8 @@ # # === KONFIGURATION === -# Container-Namen kommagetrennt (leer lassen wenn IDs genutzt werden): -CONTAINER_NAMES="container1" -# Container-IDs kommagetrennt (leer lassen wenn Namen genutzt werden): -CONTAINER_IDS="e650d85ff452" +# Container-Namen oder IDs kommagetrennt angeben (mischen erlaubt): +CONTAINERS="container1,e650d85ff452" # ====================== # Rechte-Pruefung: Kann der Benutzer docker ausfuehren? @@ -24,37 +22,20 @@ if ! docker ps -a --format '{{.ID}}' >/dev/null 2>&1; then exit 1 fi -check_container() { - local FILTER="$1" - local LABEL="$2" +IFS=',' read -ra CONTAINER_LIST <<< "$CONTAINERS" - SERVICE_NAME="Docker_${LABEL}" +for ENTRY in "${CONTAINER_LIST[@]}"; do + ENTRY=$(echo "$ENTRY" | xargs) + SERVICE_NAME="Docker_${ENTRY}" - STATUS=$(docker ps -a --filter "$FILTER" --format '{{.Names}}: {{.Status}}' 2>/dev/null | head -1) + # Suche per Name oder ID (filter sind OR-verknuepft) + STATUS=$(docker ps -a --filter "name=^/${ENTRY}$" --filter "id=${ENTRY}" --format '{{.Names}}: {{.Status}}' 2>/dev/null | head -1) if [ -z "$STATUS" ]; then - echo "2 ${SERVICE_NAME} - Container \"${LABEL}\" nicht gefunden" + echo "2 ${SERVICE_NAME} - Container \"${ENTRY}\" nicht gefunden" elif echo "$STATUS" | grep -qi "Up" && ! echo "$STATUS" | grep -qi "Restarting"; then echo "0 ${SERVICE_NAME} - ${STATUS}" else echo "2 ${SERVICE_NAME} - ${STATUS}" fi -} - -# Nach Namen pruefen -if [ -n "$CONTAINER_NAMES" ]; then - IFS=',' read -ra NAME_LIST <<< "$CONTAINER_NAMES" - for ENTRY in "${NAME_LIST[@]}"; do - ENTRY=$(echo "$ENTRY" | xargs) - check_container "name=^/${ENTRY}$" "$ENTRY" - done -fi - -# Nach IDs pruefen -if [ -n "$CONTAINER_IDS" ]; then - IFS=',' read -ra ID_LIST <<< "$CONTAINER_IDS" - for ENTRY in "${ID_LIST[@]}"; do - ENTRY=$(echo "$ENTRY" | xargs) - check_container "id=$ENTRY" "$ENTRY" - done -fi +done diff --git a/docker_file_check.sh b/docker_file_check.sh new file mode 100755 index 0000000..0dc512c --- /dev/null +++ b/docker_file_check.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# +# Checkmk Local Check: Dateien/Verzeichnisse in Docker Containern pruefen +# +# Prueft per "docker exec" ob Dateien oder Verzeichnisse in einem +# Container existieren. Funktioniert fuer beides (Datei und Verzeichnis). +# +# Status-Mapping: +# Pfad existiert -> OK (0) +# Pfad fehlt -> CRITICAL (2) +# Container nicht da -> CRITICAL (2) +# Keine Docker-Rechte -> CRITICAL (2) +# + +# === KONFIGURATION === +# Format: CONTAINER_NAME_ODER_ID:PFAD1,PFAD2,PFAD3 +# Es kann sowohl der Container-Name als auch die ID verwendet werden. +# Mehrere Container jeweils in einer eigenen Zeile. +CHECKS=( + "mein_container:/root/db.sql,/data,/root/irgendeinedatei" + # "e650d85ff452:/etc/nginx/nginx.conf,/var/log/nginx" +) +# ====================== + +# Rechte-Pruefung +if ! docker ps -a --format '{{.ID}}' >/dev/null 2>&1; then + echo "2 Docker_FileCheck - Keine Berechtigung fuer Docker oder Docker nicht verfuegbar" + exit 1 +fi + +for CHECK in "${CHECKS[@]}"; do + # Zeile aufsplitten in Container und Pfade + CONTAINER="${CHECK%%:*}" + PATHS="${CHECK#*:}" + + # Pruefen ob Container laeuft (Name oder ID) + RUNNING=$(docker ps --filter "name=^/${CONTAINER}$" --filter "id=${CONTAINER}" --format '{{.Names}}' 2>/dev/null | head -1) + if [ -z "$RUNNING" ]; then + echo "2 Docker_Files_${CONTAINER} - Container \"${CONTAINER}\" laeuft nicht oder existiert nicht" + continue + fi + + IFS=',' read -ra PATH_LIST <<< "$PATHS" + for FILEPATH in "${PATH_LIST[@]}"; do + FILEPATH=$(echo "$FILEPATH" | xargs) + # Sicherer Service-Name: Sonderzeichen ersetzen + SAFE_NAME=$(echo "${CONTAINER}_${FILEPATH}" | sed 's|[^a-zA-Z0-9_]|_|g') + SERVICE_NAME="Docker_File_${SAFE_NAME}" + + if docker exec "$CONTAINER" test -e "$FILEPATH" 2>/dev/null; then + # Typ ermitteln (Datei oder Verzeichnis) + if docker exec "$CONTAINER" test -d "$FILEPATH" 2>/dev/null; then + TYPE="Verzeichnis" + else + TYPE="Datei" + fi + echo "0 ${SERVICE_NAME} - ${TYPE} ${FILEPATH} existiert in ${CONTAINER}" + else + echo "2 ${SERVICE_NAME} - ${FILEPATH} fehlt in ${CONTAINER}" + fi + done +done