Um Nagios Plugins auf einer Remote Maschine auszuführen, wird gerne NRPE oder check_by_ssh verwendet. Es bietet sich aber an, den SNMPD für diese Aufgabe zu verwenden.
Vorteile:
Nachteile:
Wer bis jetzt nicht von den Nachteilen abgeschreckt wurde, sollte weiter lesen …
Die Datei snmpd.conf ist die zentrale Config-Datei für den SNMPD. Hier besteht die Möglichkeit, den SNMPD um eigene Aktionen zu erweitern.
exec 1.3.6.1.4.1.7411.10 check_swap /usr/local/nagios/libexec/check_swap -w 20% -c 10%
Nach einem Reload des SNMPD steht die neue OID zur Verfügung.
Bevor man jetzt voller Eifer gleich Nagios auf die OID ansetzt sollten man sich erst genau mit der Reaktion des SNMPD auf das Implantat auseinandersetzen.
Also testen wir erst einmal mit einem snmpget und schauen uns die Antwort an.
snmpwalk -v1 -c <community> -On <server_ip> 1.3.6.1.4.1.7411.10 .1.3.6.1.4.1.7411.10.1.1 = INTEGER: 1 .1.3.6.1.4.1.7411.10.2.1 = STRING: "check_swap" .1.3.6.1.4.1.7411.10.3.1 = STRING: "/usr/local/nagios/libexec/check_swap -w 20% -c 10%" .1.3.6.1.4.1.7411.10.100.1 = INTEGER: 0 .1.3.6.1.4.1.7411.10.101.1 = STRING: "SWAP OK - 100% free (2055 MB out of 2055 MB) |swap=2055MB;411;205;0;2055" .1.3.6.1.4.1.7411.10.102.1 = INTEGER: 0 .1.3.6.1.4.1.7411.10.103.1 = ""
Es kommen also einige Daten zurück. Die Daten möchte ich aber noch etwas genauer erklären.
Wir haben nun eine OID, die wir abfragen können und die Möglichkeit, die Nagios-Plugins per SNMP auszuführen.
Wenn man sich die Ausgabe des snmpwalk Befehls anschaut, stellt man fest, dass Nagios ja nur die OID 100.1 und 101.1 benötigt.
Jetzt wird das S in SNMP wieder in das richtige Licht gerückt. Bei der Verarbeitung der Daten per Script steht es wirklich wieder für “simple”.
Nagios braucht also ein kleines Perl-Plugin, das genau die oben genannten OIDs ausliest.
Mit Perl sieht das in etwa so aus:
#!/usr/bin/perl
use strict;
use Net::SNMP;
my $host_name = shift;
my $id = shift;
my ($session, $error) = Net::SNMP->session(
-hostname => $host_name,
-community => 'public',
-port => 161
);
if (!defined($session)) {
printf("ERROR: %s.\n", $error);
exit 1;
}
my $output_id = ".1.3.6.1.4.1.7411.$id.101.1";
my $state_id = ".1.3.6.1.4.1.7411.$id.100.1";
my $output = $session->get_request(
-varbindlist => [$output_id]
);
my $state = $session->get_request(
-varbindlist => [$state_id]
);
if (!defined($state)) {
printf("ERROR: %s.\n", $session->error);
$session->close;
exit 1;
}
printf("%s\n",
$output->{$output_id}
);
$session->close;
exit $state->{$state_id};
Das Plugin ist nur ein sehr einfaches Beispiel, erfüllt aber seinen Zweck.
Aufgerufen wird das Plugin mit zwei Optionen
Wenn man seine Checks über diesen Weg ausführen möchte, sollte man auf jeden Fall seine OIDs dokumentieren. Die IDs sollten über alle Rechner gleich sein.
SNMP ist nur durch die COMMUNITY geschützt und durch die Tatsache, dass nicht jeder Host Anfragen stellen darf. Kommt aber eine Anfrage durch, werden die Programme mit dem User ausgeführt, unter dem der SNMPD läuft. In der Regel ist das Root !
Also Vorsicht ! Bitte genau überlegen, was man in den SNMPD einbindet !
Ich weise hiermit ausdrücklich auf die Gefahren hin und übernehme keine Verantwortung für mögliche Schäden an Leib und Maschine.