VMware ESXi mit Nagios überwachen

Den VMware ESXi 5 mit Nagios zu überwachen ist ein Kinderspiel - wenn man die notwendigen Kniffe kennt. Damit ich sie nicht vergesse, schreibe ich sie hier als Artikel in mein Blog :-)

Vorbereitung des ESXi-Servers

Zunächst ist es notwendig, einen User zu erstellen, mit dem sich der Nagios authentifizieren kann. Das passiert ganz altmodisch mit

useradd -s /bin/true monitoring -g users

Dabei sollte man die Shell auf /bin/true setzen, um ein Login über SSH oder an der Konsole zu verhinden. Der User muss auf jeden Fall in der Gruppe users sein, sonst funktioniert der Zugriff über die Web Services nicht. Der nächste Schritt ist das Setzen eines Passwortes für den Benutzer, das passiert mit dem Befehl

passwd monitoring

Der passwd-Befehl von VMware generiert ein ziemlich langes, kryptisches Passwort, das man direkt verwenden kann. Beide Kommandos weisen darauf hin, dass sie deprecated sind und man an ihrer Statt vim-cmd verwenden soll. Die Anlage funktioniert aber auf diesem Weg nach wie vor wunderbar.

Der Nutzer muss nun noch das Recht erhalten, den Status des Hosts auszulesen. Das geschieht mit eben jenem vim-cmd nach folgendem Schema:

vim-cmd vimsvc/auth/entity_permission_add "vim.Folder:ha-folder-root" monitoring false ReadOnly true

Eine ausführliche Erklärung des Befehls ist im VMware Knowlegde Base Artikel 1006853 zu finden. Der erste Parameter vimsvc/auth/entity_permission_add besagt, dass als Befehl das Hinzufügen einer Berechtigung zu einer Entity ausgeführt werden soll. Als Entity wird vim.Folder:ha-folder-root übergeben, was den Zugriff auf den Host und die virtuellen Maschinen einbezieht. Danach folgt der Name des Benutzers. Das false besagt, dass es ein Benutzer und keine Gruppe ist, ReadOnly bedeutet, dass dieser Benutzer keine Änderungen am System vornehmen darf und das true führt dazu dass die Berechtigung an untergeordnete Entities weiter vererbt wird.

Das war auch schon alles, was auf Seite des ESXi ausgeführt werden muss. Alle anderen Aufgaben muss man auf dem Nagios-Server erledigen.

Installation des Nagios-Servers

Mein Ausgangspunkt war der Artikel HowTo: VMware ESX(i) 3.x 4.x 5.x Monitoring mit Icinga oder Nagios check_esx3.pl auf SysADMINsLife Ich war nicht mit allen Lösungen im Detail zufrieden, weshalb ich einiges angepasst habe. Außerdem ist das Ziel dort ein Debian/GNU Linux - mein Nagios läuft auf einem openSUSE 12.1, was einige Unterschiede mit sich bringt. Im Prinzip sollte aber alles auf anderen Linux-Distributionen ähnlich umzusetzen sein.

Zunächst benötigt man das vSphere SDK for Perl von VMware. Für die Installation des SDK werden einige Perl Module und devel-Pakete benötigt:

zypper in binutils openssl-devel e2fsprogs-devel

Für die Perl Module ist es empfehlenswert, das Repository devel:languages:perl zu nutzen. Das geschieht, indem man die Datei /etc/zypp/repos.d/openSUSE_BuildService_-_devel:languages:perl.repo mit folgendem Inhalt anlegt:

[openSUSE_BuildService_-_devel:languages:perl]
name=openSUSE BuildService - devel:languages:perl
enabled=1
autorefresh=1
baseurl=http://download.opensuse.org/repositories/devel:/languages:/perl/openSUSE_12.1/
path=/
type=rpm-md
keeppackages=0

Nun können die benötigten Perl-Pakete installiert werden:

zypper in perl-Crypt-SSLeay perl-Archive-Zip perl-Class-MethodMaker perl-HTML-Parser perl-UUID perl-Data-Dump perl-SOAP-Lite perl-XML-SAX perl-XML-LibXML perl-LWP-Protocol-https

Jetzt wird das vSphere SDK for Perl entpackt und installiert:

tar xvfz VMware-vSphere-Perl-SDK-5.1.0-780721.x86_64.tar.gz
cd vmware-vsphere-cli-distrib
./vmware-install.pl

Ist das SDK installiert, kann das Nagios-Plugin heruntergeladen werden. Ich verwende das Plugin check_vmware_api.pl von OP5. Die aktuellste Version dieses Plugins findet man hier.

wget "http://git.op5.org/git/?p=nagios/op5plugins.git;a=blob_plain;f=check_vmware_api.pl;hb=HEAD"
mv index.html\?p\=nagios%2Fop5plugins.git\;a\=blob_plain\;f\=check_vmware_api.pl\;hb\=HEAD check_vmware_api.pl
chmod +x check_vmware_api.pl

Damit das Plugin funktioniert, muss noch das Nagios::Plugin Modul für Perl installiert werden. Wenn das Repository für Perl wie oben beschrieben eingebunden wurde, geht das einfach über den Befehl:

zypper in perl-Nagios-Plugin

Um zu prüfen, ob alles richtig installiert ist, kann die Versionsnummer des Plugins abgefragt werden:

 ./check_vmware_api.pl -V
check_vmware_api.pl 0.7.0

Der Zugriff auf die VMware API erfolgt über SOAP via HTTPS. Hat man kein eigenes Zertifikat mit korrektem Hostnamen installiert, wird der Aufruf von check_vmware_api.pl fehlschlagen. In diesem Fall ist es zu empfehlen, folgende Zeilen in dem Script zu ergänzen:

# disable host name check for LWP
$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;

Damit wird die Hostnamen-Prüfung für SSL-Zertifikate in LWP deaktiviert. Ich habe diese Anweisung vor den Zeilen

$PROGNAME = basename($0);
$VERSION = '0.7.0';

eingefügt. Wichtig ist aber nur, dass die Variable vor dem ersten HTTP-Request gesetzt wird. In einigen Blogs liest man, dass man diese Umgebungsvariable im Init-Script für Nagios setzen soll. Das ist definitiv nicht zu empfehlen, weil man damit die Hostnamen-Validierung für alle Nagios-Plugins auf Basis von Perl/LWP deaktiviert.

Konfiguration des Nagios

Da ich Programme, die nicht über die Paketverwaltung verfügbar sind, konsequent nach /usr/local installiere, muss ich das entsprechende Verzeichnis für Nagios-Plugins noch bekannt machen. Das geschieht in der Datei /etc/nagios/resources.cfg. Hier kann auch gleich noch das Verzeichnis für die Credentials jedes Hosts konfiguriert werden.

# Directory containing additional Nagios Plugins
$USER2$=/usr/local/lib/nagios/plugins
# Directory containing host specific ESXi credentials
$USER3$=/etc/nagios/credentials

Sollten $USER2$ und $USER3$ schon belegt, sein, verwendet man einfach andere Variablen.

Sind die Ressourcen konfiguriert, kann ein Kommando konfiguriert werden. Dazu legt man die Datei /etc/nagios/commands/vmware-api.cfg mit folgendem Inhalt an:

# 'check_vmware' command definition
define command{
	command_name	check_vmware
	command_line	$USER2$/check_vmware_api.pl -H $HOSTADDRESS$ -f $USER3$/$HOSTADDRESS$ -l $ARG1$ -s $ARG2$ -w $ARG3$ -c $ARG4$
}

Hier wird dann auch deutlich, warum wir das Verzeichnis für die Credentials angelegt und in den Nagios-Resourcen konfiguriert haben. Das check_vmware_api.pl-Plugin kann nämlich mit der Option -f eine Datei als Parameter entgegennehmen, die dem folgenden Schema entspricht.

username=monitoring
password=secret

Die Datei mit den Credentials sollte als Namen den als $HOSTADDRESS$ verwendeten Wert haben. Das ist normalerweise innerhalb von Nagios eindeutig und reicht für die Zuordnung aus. Damit muss z.B. Nagios nicht neu gestartet werden, wenn sich ein Passwort ändert.

Den konfigurierten Aufruf kann man wie folgt testen:

/usr/local/lib/nagios/plugins/check_vmware_api.pl -H 10.0.0.3 -f /etc/nagios/credentials/10.0.0.3 -l runtime -s status
CHECK_VMWARE_API.PL OK - overall status=green

Zu guter Letzt kann man noch den Aufruf des Nagios-Kommandos für den ESXi-Host konfigurieren. Als Beispiel soll die Abfrage der Prozessorauslastung dienen:

define service{
	name			esxi-cpu-usage
	host_name		esxi-host
	service_description	CPU usage
	check_command		check_vmware!CPU!usage!80!90
	use			24x7-service
	contact_groups		theadmins
}

Die möglichen Parameter, die an Stelle von CPU und usage verwendet werden können, kann man sich mit check_vmware_api.pl -h anzeigen lassen.

Referenzen