Seite wählen

Icinga 2 und Auto-Discovery mit SNMP

von | Mrz 28, 2014 | Linux, Icinga, Development, Network

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 Kommentare

Einen Kommentar abschicken

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

Mehr Beiträge zum Thema Linux | Icinga | Development | Network