addes file
This commit is contained in:
parent
c9ae1afc81
commit
3a8b84e02d
125
README.md
125
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_<containername>` 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.
|
||||
|
|
|
|||
|
|
@ -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/`).
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
Loading…
Reference in New Issue