Nachdem ich meine eigenen VMs lange Zeit mit “Monitoring per Jabber” überwacht habe (sprich: User schreiben mir Jabber-Nachrichten/Mails/u.ä., wenn etwas nicht mehr geht), habe ich mich endlich entschlossen, diese automatisiert zu überwachen.
Hierbei wollte ich meinen Usern auch gleich die Möglichkeit geben, zusätzlich zu den von mir vordefinierten Checks, eigene Services zu überwachen, ohne ihnen dabei direkt Zugriff auf meine Monitoring-Config zu geben.
Bei meinen Tests hat sich SNMP dabei als recht flexibel erwiesen. Zunächst bekommt jede VM eine eigene Community zugewiesen, damit die VMs nicht gegenseitig auf ihre Monitoring-Daten zugreifen können. Der jeweilige Community-Name ist dabei der HMAC-Hash der IP-Adresse. Der HMAC-Schlüssel ist dabei geheim und wird auf den VMs selbst nirgendwo gespeichert.
Die eigene Community bekommen die VMs über ein PHP-Script:
<?php $pkey = "hmac_schlüssel_hier"; echo substr(hash_hmac("sha256", $_SERVER["REMOTE_ADDR"], $pkey), 0, 12);
Das Installationsscript für die VMs sieht dabei in etwa so aus:
#!/bin/sh set -e apt-get install -y snmpd nagios-plugins-basic COMMUNITY=$(curl cat >/etc/snmp/snmpd.conf <<CONFIG agentAddress udp:0.0.0.0:161 view systemonly included .1.3.6.1.4.1.8072.1.3 rocommunity $COMMUNITY default -V systemonly rouser authOnlyUser extend apt /opt/monitoring/exec_plugin /usr/lib/nagios/plugins/check_apt extend disk /opt/monitoring/exec_plugin /usr/lib/nagios/plugins/check_disk -w 10 -c 5 -p / extend swap /opt/monitoring/exec_plugin /usr/lib/nagios/plugins/check_swap -w 50 -c 25 extend procs /opt/monitoring/exec_plugin /usr/lib/nagios/plugins/check_procs -w 500 -c 1000 extend users /opt/monitoring/exec_plugin /usr/lib/nagios/plugins/check_users -w 10 -c 25 extend load /opt/monitoring/exec_plugin /usr/lib/nagios/plugins/check_load -w 5 -c 10 CONFIG service snmpd restart mkdir -p /opt/monitoring cat >/opt/monitoring/exec_plugin <<SCRIPT #!/bin/sh output=\$(\$@ 2>&1) status=\$? echo \$status \$output SCRIPT chmod +x /opt/monitoring/exec_plugin
Bei meiner SNMP-Config habe ich bewusst darauf verzichtet, “normale” OIDs abzufragen, sondern verwende ausschließlich extend. Der Vorteil davon ist, dass ich auf Seite der Monitoring-VM ein einziges Plugin zum Checken aller Services benötige.
Um zu erkennen, welche Services eine VM hat, habe ich ein Script geschrieben, das anhand eines SNMP-Walks Icinga-Templates erstellt. Dieses läuft als Cronjob und aktualisiert in regelmäßigen Abständen die Config, sofern die jeweiligen Hosts erreichbar sind:
$ /opt/monitoring/discover-snmp.py --key hmac_schlüssel_hier 213.95.47.212 IP address: 213.95.47.212, SNMP Community: xxxxxxx template Host "snmp-extend:213.95.47.212" { macros["community"] = "xxxxxxx", services["apt"] = { templates = [ "snmp-extend-service" ], check_command = "snmp-extend", macros["plugin"] = "apt" }, services["disk"] = { templates = [ "snmp-extend-service" ], check_command = "snmp-extend", macros["plugin"] = "disk" }, services["load"] = { templates = [ "snmp-extend-service" ], check_command = "snmp-extend", macros["plugin"] = "load" }, services["swap"] = { templates = [ "snmp-extend-service" ], check_command = "snmp-extend", macros["plugin"] = "swap" }, services["procs"] = { templates = [ "snmp-extend-service" ], check_command = "snmp-extend", macros["plugin"] = "procs" }, services["users"] = { templates = [ "snmp-extend-service" ], check_command = "snmp-extend", macros["plugin"] = "users" }, }
Das Check-Plugin für den “snmp-extend”-Check fragt dabei mit snmpget die entsprechende OID ab. Prinzipiell wird hier SNMP eigentlich nur als Transport für die Check-Results verwendet.
Um das ganze noch etwas benutzerfreundlicher zu gestalten, wären noch einige Änderungen notwendig:
- idealerweise gäbe es statt dem Installationsscript ein updatebares Debian-Paket (oder RPM, MSI, etc. – wobei ich selbst eigentlich nur Debian-VMs habe)
- Die Services sollten jeweils in einer einzelnen Datei sein, dies würde das Aktualisieren der snmpd-Config erleichtern
- Je nach Umgebung wäre es praktisch, snmpd auf einem anderen Port zu starten – und eine separate Config-Datei zu verwenden
- SNMPv3 unterstützt Verschlüsselung; für meinen Anwendungsfall ist dies aber nicht notwendig, da die anderen VMs entweder auf demselben Server sind oder ausschließlich per VPN erreichbar sind
0 Comments