Wie man ein eigenes Nagios-Check-Plugin schreibt

Dieses Tutorial wurde mit Nagios Core 4.3.4 unter Debian 9.2 getestet.

Auch wenn Nagios Exchange Tausende von verfügbaren Plugins zum freien Download anbietet, ist der zu prüfende Status manchmal sehr spezifisch für Ihr Szenario.

Erwägungen

Es wird davon ausgegangen, dass:

  • Sie haben Nagios installiert.
  • Sie kennen die Grundlagen der Nagios-Administration.

Der Nagios-Server in diesem Beispiel wird auf 192.168.0.150 gehostet, und ein Beispiel-Client wird auf IP 192.168.0.200 gehostet.

Beenden-Codes

Um den Status eines überwachten Service zu ermitteln, führt Nagios ein Check-Plugin darauf aus. Nagios kann den Status des Service erkennen, indem es den Exit-Code des Checks liest.

Nagios versteht die folgenden Exit-Codes:

  • 0 – Dienst ist OK.
  • 1 – Dienst hat eine WARNUNG.
  • 2 – Der Dienst befindet sich in einem KRITISCHEN Status.
  • 3 – Der Dienst befindet sich im Status UNBEKANNT.

Ein Programm kann in jeder Sprache geschrieben werden, um als Nagios-Check-Plugin zu funktionieren. Basierend auf dem geprüften Zustand kann das Plugin Nagios auf einen nicht funktionierenden Dienst aufmerksam machen.

Beispiel-Plugin

Ich werde ein einfaches Beispiel verwenden. Ich habe ein Plugin in ein Bash-Skript geschrieben, um nach aktuellen Warnungen zu suchen. Nehmen wir an, ich habe den Nagios-Server so konfiguriert, dass er nur bei einem kritischen Status eine Warnung ausgibt, also möchte ich eine Warnung, wenn ich zu viele Dienste bei einem Warnungsstatus habe.

Beachten Sie das folgende Skript (check_warnings.sh):

#!/bin/bash

countWarnings=$(/usr/local/nagios/bin/nagiostats | grep "Ok/Warn/Unk/Crit:" | sed 's/[[:space:]]//g' | cut -d"/" -f5)

if (($countWarnings<=5)); then
                echo "OK - $countWarnings services in Warning state"
                exit 0
        elif ((6<=$countWarnings && $countWarnings<=30)); then
				# This case makes no sense because it only adds one warning.
				# It is just to make an example on all possible exits.
                echo "WARNING - $countWarnings services in Warning state"
                exit 1
        elif ((30<=$countWarnings)); then
                echo "CRITICAL - $countWarnings services in Warning state"
                exit 2
        else
                echo "UNKNOWN - $countWarnings"
                exit 3
fi

Basierend auf den Informationen, die das Werkzeug nagiostats liefert, gehe ich davon aus, dass alles in Ordnung ist, wenn es fünf oder weniger Dienste im Zustand Warnung gibt.

Ich werde dieses Skript mit allen anderen Nagios-Plugins in /usr/local/nagios/libexec/ belassen (Dieses Verzeichnis kann je nach Konfiguration unterschiedlich sein).

Wie bei jedem Nagios-Plugin werden Sie den Status von der Kommandozeile aus überprüfen wollen, bevor Sie es in die Konfigurationsdateien einfügen.

Denken Sie daran, die Ausführung des Skripts zuzulassen:

sudo chmod +x /usr/local/nagios/libexec/check_warnings.sh

Und dann lassen Sie ihn wie jedes andere Skript laufen:

Nagios-Skript ausführen

Das Ergebnis ist eine Textnachricht und ein Exit-Code:

Das Ergebnis des Skripts

Neues Prüfkommando und neuen Dienst einrichten

Dieser Schritt gilt auch für Ihre eigenen Plugins und wenn Sie ein Plugin eines Drittanbieters aus dem Internet herunterladen.

Zuerst sollten Sie einen Befehl in der Datei commands.cfg definieren. Der Speicherort dieser Datei hängt von der Konfiguration ab, die Sie vorgenommen haben, in meinem Fall ist es in /usr/local/nagios/etc/objects/commands.cfg.

Daher füge ich am Ende der Datei den folgenden Block an:

# Custom plugins commands...
define command{
	command_name check_warnings
	command_line $USER1$/check_warnings.sh
}

Denken Sie daran, dass die Variable $USER1$ eine lokale Nagios-Variable ist, die in der Datei resource.cfg gesetzt ist und in meinem Fall auf /usr/local/nagios/libexec zeigt.

Nachdem Sie den Befehl definiert haben, können Sie diesen Befehl einem Service und dann einem Host zuordnen. In diesem Beispiel definieren wir einen Service und weisen ihn localhost zu, denn diese Prüfung findet auf Nagios selbst statt.

Bearbeiten Sie die Datei /usr/local/nagios/etc/objects/localhost.cfg und fügen Sie den folgenden Block hinzu:

# Example - Check current warnings...
define service{
	use local-service
	host_name localhost
	service_description Nagios Server Warnings
	check_command check_warnings
}

Nun sind wir alle bereit, das einzige, was noch aussteht, ist das erneute Laden von Nagios, um die Konfigurationsdateien erneut zu lesen.

Denken Sie immer daran, vor dem Neuladen von Nagios zu überprüfen, ob es keine Fehler in der Konfiguration gibt. Sie tun dies mit dem Nagios -v-Kommando als root:

sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

Sie sollten so etwas wie das hier bekommen:

Nagios-Konfiguration prüfen

Stellen Sie sicher, dass sie 0 Fehler und 0 Warnungen zurückgibt und fahren Sie fort, den Dienst neu zu laden:

sudo systemctl reload-or-restart nagios.service

Nach dem Neuladen des Dienstes werden Sie den zugehörigen Check im localhost sehen. Zunächst als ausstehend:

Dienstprüfung ausstehend

Und nach der Ausführung mit seinem Ergebnis:

Dienstprüfung OK

NRPE zur Ausführung auf Clients verwenden

Um ein Skript auf einem Remote-Client auszuführen, müssen Sie den Nagios Remote Plugin Executor (NRPE) einrichten.

Da dieses Tutorial auf Debian 9 basiert, werde ich als Beispiel zeigen, wie man es installiert, aber Sie können Anleitungen für jede Distribution finden.

Generische Installation auf Debian-basiertem Client

Beachten Sie, dass die gesamte Konfiguration in diesem Abschnitt auf dem zu prüfenden Client und nicht auf dem Nagios-Server vorgenommen wird.

Installieren Sie NRPE- und Nagios-Plugins:

sudo apt-get install libcurl4-openssl-dev nagios-plugins nagios-nrpe-server nagios-nrpe-plugin --no-install-recommends
sudo ln -s /usr/lib/nagios/plugins/check_nrpe /usr/bin/check_nrpe

Erlauben Sie dem Nagios-Server, Kommandos auf dem Client auszuführen, indem Sie ihn dem Eintrag allowed_hosts in /etc/nagios/nrpe.cfg hinzufügen. Die Zeile sollte wie folgt aussehen:

allowed_hosts=127.0.0.1,::1,192.168.0.150

Definieren Sie die Standardprüfungen, die Sie auf jedem Client mit NRPE durchführen werden. Definieren Sie die Prüfungen auf /etc/nagios/nrpe_local.cfg. Ein Modell für die Datei könnte zum Beispiel sein:

######################################
# Do any local nrpe configuration here
######################################
#-----------------------------------------------------------------------------------
# Users
   command[check_users]=/usr/lib/nagios/plugins/check_users -w 5 -c 10

# Load
   command[check_load]=/usr/lib/nagios/plugins/check_load -w 15,10,5 -c 30,25,20
   command[check_zombie_procs]=/usr/lib/nagios/plugins/check_procs -w 5 -c 10 -s Z
   command[check_total_procs]=/usr/lib/nagios/plugins/check_procs -w 150 -c 200

# Disk
   command[check_root]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /
   command[check_boot]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /boot
   command[check_usr]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /usr
   command[check_var]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /var
   command[check_tmp]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /tmp
   # If you want to add a non-standard mount point:
   # command[check_mnt1]=/usr/lib/nagios/plugins/check_disk -w 4% -c 1% -p /export
#-----------------------------------------------------------------------------------

Die Idee, diese generische Datei zu haben, ist, dass Sie auf jedem Client dasselbe überprüfen können.

Stellen Sie sicher, dass die lokale Datei und das .d-Verzeichnis in der Hauptkonfigurationsdatei mit enthalten sind mittels grep Mustersuche:

cat /etc/nagios/nrpe.cfg | grep include | grep -v ^#

Prüfen Sie, ob die Datei in der Konfiguration enthalten ist

Starten Sie den Dienst neu:

sudo systemctl restart nagios-nrpe-server.service

Prüfen Sie, ob der NRPE-Dienst läuft:

cat /etc/services | grep nrpe
netstat -at | grep nrpe

NRPE-Dienst prüfen

Prüfen Sie nun eines der zuvor definierten NRPE-Kommandos vom Nagios-Server:

NRPE-Befehl prüfen

Beachten Sie, dass das NRPE-Kommando check_users in der Datei /etc/nagios/nrpe_local.cfg definiert wurde, um /usr/lib/nagios/plugins/check_users -w 5 -c 10 auszuführen.

Falls Sie das Plugin nicht auf dem Nagios-Server haben, können Sie es mit installieren:

sudo apt-get install nagios-nrpe-plugin

Zusammenfassend kann man also sagen, dass das NRPE ein Skript auf einem Remote-Host ausführt und den Exit-Code an den Nagios-Server zurückgibt.

Konfiguration für benutzerdefinierte Skripte

Um ein benutzerdefiniertes Skript als Plugin für die Remote-Ausführung über NRPE zu verwenden, sollten Sie das Skript zunächst auf dem Server schreiben, z. B. in /usr/local/scripts/check_root_home_du.sh:

#!/bin/bash

homeUsage=$(du -s /root/ | cut -f1)

if (($homeUsage<=$((1024*1024)))); then
                echo "OK - Root home usage is $(du -sh /root/ | cut -f1)"
                exit 0
        elif (($((1024*1024))<$homeUsage && $homeUsage<=$((3*1024*1024)))); then
                echo "WARNING - Root home usage is $(du -sh /root/ | cut -f1)"
                exit 1
        elif (($((3*1024*1024))<$homeUsage)); then
                echo "CRITICAL - Root home usage is $(du -sh /root/ | cut -f1)"
                exit 2
        else
                echo "UNKNOWN - Value received: $homeUsage"
                exit 3
fi

Erlauben Sie die Ausführung des Skripts:

sudo chmod +x /usr/local/scripts/check_root_home_du.sh

Das vorherige Skript ist ein sehr einfaches Beispiel, das die Plattennutzung des Verzeichnisses /root überprüft und einen Schwellenwert für die Berücksichtigung als OK, Warnung oder Kritisch festlegt.

Fügen Sie das Kommando in die NRPE-Konfigurationsdatei auf dem Client ein (/etc/nagios/nrpe_local.cfg):

# Custom
   command[check_root_home_du]=/usr/local/scripts/check_root_home_du.sh

Und den NRPE-Hörer neu starten:

sudo systemctl restart nagios-nrpe-server.service

Jetzt können wir auf den Server zugreifen und ihn wie jedes Standard-Plugin testen

Testen wie ein Standard-Plugin

Setzen Sie die NRPE-Prüfung in den Server-Konfigurationsdateien

Jetzt wissen wir, dass das benutzerdefinierte Plugin sowohl auf dem Client als auch auf dem Server funktioniert und dass das NRPE korrekt kommuniziert, und wir können die Nagios-Dateien für die Überprüfung des entfernten Geräts konfigurieren. Setzen Sie also auf dem Server die Dateien:

/usr/local/nagios/etc/objects/commands.cfg:

#...
define command{
	command_name check_nrpe
	command_line /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}

/usr/local/nagios/etc/objects/nrpeclient.cfg:

define host{
    use          linux-server
    host_name    nrpeclient
    alias        nrpeclient
    address      192.168.0.200
}

define service{
	use                 local-service
	host_name           nrpeclient
	service_description Root Home Usage
	check_command       check_nrpe!check_root_home_du
}

Beachten Sie, dass die Markierung ! den Befehl von den Argumenten im Eintrag check_command trennt. Dies definiert, dass check_nrpe der Befehl und check_root_home_du der Wert von $ARG1$ ist.

Abhängig von Ihrer Konfiguration sollten Sie auch diese letzte Datei zur Hauptdatei hinzufügen (/usr/local/nagios/etc/nagios.cfg):

#...
cfg_file=/usr/local/nagios/etc/objects/nrpeclient.cfg
#...

Überprüfen Sie die Konfiguration und, falls keine Fehler oder Warnungen auftreten, laden Sie den Service neu:

/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
sudo systemctl reload-or-restart nagios.service

Und jetzt haben Sie eine neue benutzerdefinierte Prüfung auf einem Host:

Neue benutzerdefinierte Prüfung funktioniert

Schlussfolgerung

Nagios hat eine riesige Bibliothek von Plugins, die in der Nagios-Börse verfügbar ist. In einer großen Umgebung ist es jedoch sehr wahrscheinlich, dass es z.B. einige benutzerdefinierte Prüfungen für bestimmte Anwendungen benötigt: Überprüfung eines bestimmten Aufgabenergebnisses, Überwachung einer selbst entwickelten Anwendung, u.a.

Die Flexibilität, die Nagios bietet, ist für diese Fallszenarien perfekt.

Das könnte dich auch interessieren …