Ziel des Tutorials
In diesem Tutorial stelle ich euch mein Script vor, das ich benutze um LXC-Container und VMs anhand von HTML-Fehlercodes neuzustarten. Hintergrund ist, dass ich einen Dienst hatte der sich gerne mal bei zu viel Last und zu wenig zugewiesenen Resourcen verabschiedet hatte und einen 503 Bad Gateway produziert hat. Mittels des Scriptes wird der Webserver regelmäßig geprüft und im Falle von zuvor definierten Fehlercodes neugestartet. Bei Bedarf wird eine Mail Notification gesendet.
Requierments
Das ausführende System muss für den Mailversand vorbereitet sein. Ich nutze hierfür postfix. Des Weiteren muss der Zugriff auf das Internet mögich sein, damit der Status-Code abgefragt werden kann und das ausführende System muss auf das Netzwerk zugreifen können in dem sich der Proxmox-Host befindet.
Das Script
Der Dienst besteht aus dem Script selber sowie zwei Config-Files und einem Systemd-Timer und Service.
http-status-checker.sh
| |
Neben dem Script gibt es zwei Config-Files. In der ersten http_codes.conf können die HTTP-Codes hinterlegt werden bei denen ein Event ausgelöst werden soll. Der Inhalt der Config sieht so aus:
| |
Eine gute Quelle für die HTTP-Codes und was sie bedeuten gibt es auf Wikipeda.
Die zweite Config-File credentials.conf beinhaltet den API-Token und URL zu dem Proxmox-Host und die Nodes die überwacht werden sollen.
| |
Das erstellen von Token für die Proxmox-API und das Steuern der Rechte beschreibe ich in einem weiteren Tutorial ausführlich.
SystemD-Timer und Dienst
Damit das Script ausgeführt werden kann greifen wir auf einen SystemD-Timer check-website.timer zurück. In diesem können wir auch den Prüf-Intervall festlegen:
| |
Der Timer wird anschließend mittels SystemD-Service check-website.service gestartet und auch bei Bedarf gestoppt:
| |
Nachdem ihr den Timer und Dienst erstellt habt, müsst ihr die SystemD-Config mittels sudo systtemctl daemon-reload neuladen, enablen und starten. Das macht ihr am besten mit sudo systemctl enable --now check-website.timer. Wenn man mit einem Timer arbeitet muss nur der Timer gestartet werden, der Timer triggert anschließend den Service. Ist in dem Timer, unter [Timer] keine Unit= definiert wie in diesem Fall, müssen die Timer-Unit und Service-Unit den gleichen Basis-Namen tragen.
Fandest du diesen Artikel hilfreich? Dann freue ich mich über einen Kaffee! ❤️