Icinga

5.1. Icinga Plugins

5.1.1. Einführung
5.1.2. Was sind Plugins?
5.1.3. Plugins als eine Abstraktionsschicht
5.1.4. Welche Plugins sind verfügbar?
5.1.5. Plugins beschaffen
5.1.6. Zum Icinga-Benutzer wechseln
5.1.7. Anpassen der Umgebung
5.1.8. Wie benutze ich Plugin X?
5.1.9. Integration eines neuen Plugins
5.1.10. Raw command line
5.1.11. Schwellwert und Bereiche
5.1.12. Aktivieren der Definition
5.1.13. Plugin API

5.1.1. Einführung

Icinga enthält nicht, wie viele andere Überwachungs-Tools, interne Mechanismen zur Prüfung des Zustands von Hosts und Services in Ihrem Netzwerk. Icinga verlässt sich statt dessen auf externe Programme (Plugins genannt), die all die schmutzige Arbeit tun.

5.1.2. Was sind Plugins?

Plugins sind kompilierte Programme oder Scripts (Perl-Scripts, Shell-Scripts, usw.), die von einer Kommandozeile aus laufen können, um den Status eines Hosts oder Service zu prüfen. Icinga benutzt die Ergebnisse von Plugins, um den aktuellen Status von Hosts oder Services in Ihrem Netzwerk zu ermitteln.

Icinga wird ein Plugin immer dann ausführen, wenn die Notwendigkeit besteht, den Status eines Hosts oder Service zu prüfen. Das Plugin tut etwas (beachten Sie den sehr allgemeinen Ausdruck), um die Prüfung auszuführen und dann einfach die Ergebnisse an Icinga zurückzuliefern. Icinga wird die Ergebnisse verarbeiten, die es vom Plugin erhält, und dann notwendige Aktionen ausführen (starten von Eventhandlern, senden von Benachrichtigungen, etc).

5.1.3. Plugins als eine Abstraktionsschicht

Plugins arbeiten wie eine Abstraktionsschicht zwischen der Überwachungslogik im Icinga-Dämon und den eigentlichen Services und Hosts, die überwacht werden.

Der Vorteil dieses Typs von Plugin-Architektur ist, dass Sie fast alles überwachen können, was Ihnen einfällt. Wenn Sie den Prozess der Überwachung automatisieren können, können Sie es mit Icinga überwachen. Es gibt bereits eine Menge von Plugins, die erzeugt wurden, um grundlegende Ressourcen wie z.B. Prozessorauslastung, Plattenbelegung, Ping-Raten usw. zu überwachen. Wenn Sie etwas anderes überwachen möchten, werfen Sie einen Blick in die Dokumentation zu Plugins schreiben und erstellen Sie ein eigenes. Es ist einfach!

Der Nachteil dieses Typs von Plugin-Architektur ist die Tatsache, dass Icinga absolut keine Ahnung davon hat, was Sie überwachen. Sie könnten Netzwerkverkehr-Statistiken, Datenfehler-Raten, Raumtemperatur, CPU-Spannung, Lüftergeschwindigkeit, Prozessorauslastung, Plattenbelegung überwachen oder die Fähigkeit Ihres superphantastischen Toasters, am Morgen Ihr Brot ordnungsgemäß zu bräunen... Icinga versteht nicht die Besonderheiten dessen, was überwacht wird - es verfolgt lediglich Veränderungen des Zustands dieser Ressourcen. Nur die Plugins selbst wissen genau, was sie überwachen und wie die eigentlichen Prüfungen auszuführen sind.

5.1.4. Welche Plugins sind verfügbar?

Es gibt bereits zahlreiche Plugins, um viele verschiedene Arten von Geräten und Services zu überwachen, u.a.:

5.1.5. Plugins beschaffen

Plugins werden nicht mit Icinga verteilt, aber Sie finden die offiziellen Nagios-Plugins zum Download und viele weitere Plugins, die von Nagios-Benutzern erstellt und gewartet werden, an folgenden Stellen:

Nach dem Herunterladen müssen Sie die Plugins installieren. Bitte lesen Sie die Dokumentation (falls vorhanden), wie das zu tun ist. Sie könnte wichtige Informationen über die Voraussetzungen wie z.B. zusätzliche Pakete oder (Perl-) Module enthalten, wie das Plugin zu installieren ist bzw. distributionsabhängige Hinweise.

Manchmal müssen Sie das Plugin kompilieren, wobei Sie den Vorgang durch den Aufruf von "./configure" mit oder ohne Optionen vorbereiten. Bitte prüfen Sie die Datei config.log auf mögliche Fehler zu fehlenden (devel-)Paketen vor dem Aufuf des eigentlichen Compile-Vorgangs (meistens "make" oder "make all"). In den meisten Fällen wird das Plugin durch den Aufruf von "make install" in das Plugins-Verzeichnis (z.B. /usr/local/icinga/libexec) kopiert.

Manchmal müssen Sie das Plugin auf Ihre Umgebung anpassen (z.B. den Pfad zu "utils.pm"). Sie können stattdessen einen logischen Link erzeugen, der auf das Plugin-Verzeichnis weist, so dass Sie nicht das Plugin ändern müssen, um diese Änderung zu umgehen und spätere Updates zu vereinfachen. Das könnte wie folgt geschehen:

 $> mkdir /usr/local/nagios
 $> ln -s /usr/local/icinga/libexec /usr/local/nagios/libexec
[Anmerkung] Anmerkung

Bei Verwendung von Paketen kann der Pfad zum Plugin-Verzeichnis anders lauten (z.B. /usr/lib/plugins), so dass Sie den Befehl entsprechend anpassen müssen.

5.1.6. Zum Icinga-Benutzer wechseln

[Wichtig] Wichtig

Führen Sie Plugins immer mit dem Icinga-Benutzer aus, denn einige Plugins erstellen temporäre Dateien. Wenn Sie Plugins mit einem anderen Benutzer ausführen, dann kann der Icinga-Benutzer diese Dateien ggf. nicht überschreiben. Wenn Sie einen anderen Benutzer verwenden, werden Sie nicht feststellen, ob ist der Icinga-Benutzer überhaupt berechtigt ist, auf bestimmte Dateien (z.B. Shared Libraries) zuzugreifen.

Rufen Sie das Plugin nicht mit einem relativen Pfad auf (z.B. ./check_test_plugin). Benutzen Sie immer absolute Pfade, denn so macht es auch Icinga (z.B. /usr/local/icinga/libexec/check_test_plugin).

Bitte beachten Sie, dass der Icinga-Benutzer eine andere Umgebung als der Icinga-Prozess hat. Beim Benutzer wurden Login-Skripte durchlaufen und es ist ein Terminal mit der Benutzer-Sitzung verbunden, so dass die erfolgreiche Ausführung eines Plugins von der Kommandozeile aus nicht (notwendigerweise) bedeutet, dass es funktioniert, wenn es vom Prozess ausgeführt wird. Außerdem wird der Prozess per Default keine Shell benutzen, sondern Aufrufe von popen/execvp ausführen, abhängig vom Befehl (popen falls die Kommandozeile Metazeichen enthält, die Bedeutung für die Shell haben wie z.B. !$^&*()~[]\|{};<>?'", execvp falls keine Metazeichen vorhanden sind).

Wechseln Sie zum Icinga-Benutzer, der in icinga.cfg definiert ist, falls noch nicht geschehen, und bereinigen Sie die Umgebung

 #> su - icinga
 #> env -i

Wenn Sie jetzt angemeldet sind, dann springen Sie zum Punkt "Anpassen der Umgebung".

Bedingt durch das Sicherheitsbewusstsein des Packagers / Systemadministrators könnte dies fehlschlagen, weil der Account für Anmeldungen gesperrt ist. Bitten Sie Ihren Systemadministrator, das vorübergehend zu ändern oder führen Sie einen der folgenden Punkte aus

5.1.7. Anpassen der Umgebung

Einige Prüfungen (wie check_oracle_health) hängen davon ab, dass verschiedene Umgebungsvariablen gesetzt sind. Setzen Sie diese nicht in .bashrc oder anderen benutzerabhängigen Dateien, sondern wählen Sie dafür eine zentrale Stelle. Das Default-Init-Skript durchläuft die Datei /etc/sysconfig/icinga (wenn sie vorhanden ist), so dass es ein idealer Platz wäre. Benutzen Sie dafür nicht das Init-Skript selbst, weil Ihre Änderungen sonst bei Updates ggf. verloren gehen.

Beispiel für /etc/sysconfig/icinga

 export ORACLE_HOME=/usr/lib/oracle/11.2/client64
 export LD_LIBRARY_PATH=$ORACLE_HOME/lib
 export PATH=$PATH:$ORACLE_HOME

Nachdem Sie sich angemeldet haben, sind diese Variablen noch nicht verfügbar, aber das ist ziemlich einfach

 $> . /etc/sysconfig/icinga

Bitte überprüfen Sie die Einstellungen

 $> echo $ORACLE_HOME
 $> echo $LD_LIBRARY_PATH
 $> echo $PATH

5.1.8. Wie benutze ich Plugin X?

Fast alle Plugins zeigen grundlegende Bedienungshinweise an, wenn sie von der Kommandozeile mit der Option '-h' oder '--help' aufgerufen werden. Wenn Sie z.B. wissen möchten, wie das Plugins check_http arbeitet bzw. welche Optionen es akzeptiert, sollten Sie folgenden Befehl ausprobieren:

 $> ./check_http --help

5.1.9. Integration eines neuen Plugins

Nach der Installation des Plugins rufen Sie es mit den nötigen Optionen von der Kommandozeile aus auf. Wenn dies funktioniert, können Sie es in Icinga integrieren.

Stellen Sie sich vor, dass Sie den folgenden Aufruf benutzt haben:

 /usr/local/icinga/libexec/sample-plugin.pl -H 192.168.1.2 -a argument1 -p parameter -n 5

Die command-Definition enthält zwei Direktiven

 define command{ 
    command_name check_sample
    command_line $USER1$/sample-plugin.pl -H $HOSTADDRESS$ -a $ARG1$ -p $ARG2$ -n $ARG3$
    }

Dann müssen wir die check_command-Direktive definieren, die Teil der Host-/Service-Definition ist. Es beginnt mit dem Kurznamen gefolgt von den Argumenten, die jeweils durch Ausrufezeichen voneinander getrennt sind:

 check_command check_sample!argument1!parameter!5

Wie Sie sehen, wird die IP-Adresse nicht angegeben, denn sie wird aus der Host-Definition genommen.

Das zusammensetzen in umgekehrter Reihenfolge zeigt, wie Icinga die Informationen verarbeitet:

 check_command check_sample!argument1!parameter!5
                                |         |     +-------------------------------------+
                                |         +---------------------------------+         |
                                +---------------------------------+         |         |
                                                                  |         |         |
 Host macro ----------------------------------------+             |         |         |
                                                    |             |         |         |
 User macro --------+                               |             |         |         |
                    |                               |             |         |         |
 command_line      $USER1$/sample-plugin.pl -H $HOSTADDRESS$ -a $ARG1$ -p $ARG2$ -n $ARG3$

resultiert in:

 /usr/local/icinga/libexec/sample-plugin.pl -H 192.168.1.2 -a argument1 -p parameter -n 5

Neben den bereits genannten gibt es eine Vielzahl von Makros, die die Arbeit erleichtern. Dabei gibt es einige Dinge anzumerken:

NRPE und "dont_blame_nrpe=1"

Die Benutzung von NRPE mit Argumenten erfordert etwas Aufmerksamkeit. Wenn wir annehmen, dass Sie die Argumentverarbeitung auf dem entfernten Rechner in der Datei nrpe.cfg mit Hilfe von "dont_blame_nrpe=1" (oder durch "allow_arguments=1" in nsc.ini) aktiviert haben, dann können Sie Parameter vom Icinga-Server an den entfernten Rechner übergeben. Lassen Sie uns folgende Definitionen annehmen.

Auf dem Icinga-Server

 define command{
    command_name check_nrpe
    command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a $ARG2$
    }

 define service{
    ...
    check_command check_nrpe!check_process!cupsd

Auf dem entfernten Rechner in der NRPE-Konfigurationsdatei

...
command[check_process]=your_plugin "$ARG1$"

Der Icinga-Prozess wird die Definitionen wie folgt auflösen

 check_command check_nrpe!check_process!cupsd
                                |         |
                                |         +---------------------------+
                                +---------------------------+         |
                                                            |         |
 Host macro ----------------------------------+             |         |
                                              |             |         |
 User macro --------+                         |             |         |
                    |                         |             |         |
 command_line      $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a $ARG2$

resultiert in:

 /usr/local/icinga/libexec/check_nrpe -H 192.168.1.2 -c check_process -a cupsd

Auf dem entfernten Rechner erhält der NRPE-Prozess einen Aufruf mit zwei Parametern: "check_process" und "cupsd". Der erste wird entfernt, um den Befehl festzulegen, der auszuführen ist, so dass nur ein Argument an den Befehl übergeben wird!

[Anmerkung] Anmerkung

$ARG1$ auf dem entfernten Rechner ist nicht das gleiche wie auf dem Icinga-Server!

5.1.10. Raw command line

Das klassische UI ermöglicht die Anzeige der Kommandozeile mit aufgelösten Variablen einschließlich der Werte aus resource.cfg. Der Klick auf "ACTIVE" neben "Check type" in den Host-/Service Check Details gibt Ihnen Zugriff auf diese Informationen. Wenn Sie noch keine Prüfung definiert haben, dann wählen Sie "View Config" aus den Hauptmenü auf der linken Seite und dann "Command expansion". Bitte beachten Sie, dass der Benutzer über die Direktive authorized_for_full_command_resolution in cgi.cfg explizit dazu berechtigt sein muss, die Werte der Variable aus resource.cfg sehen zu dürfen. Außerdem muss der Benutzer, unter dem der Web-Server läuft, Leseberechtigung auf diese Datei besitzen.

Wenn Sie die Kommandozeile protokollieren möchten, dann müssen Sie einige Direktiven in icinga.cfg auf die folgenden Werte ändern

 #  16 = Host/service checks
 # 256 = Commands
 debug_level=272
 debug_verbosity=2
 max_debug_file_size=1000000000

5.1.11. Schwellwert und Bereiche

Einige Plugins unterstützen Bereichsangaben für die Warn- und Kritisch-Werte. Bitte überprüfen Sie die Dokumentation, ob das der Fall für das Plugin ist, das Sie benutzen möchten. Das Folgende ist ein Auszug der (englischsprachigen) Entwickler-Richtlinien:

Ein Bereich ist definiert als ein Start- und Endpunkt (inklusive) auf einer numerischen Skala (ggf. bis zu +/--Unendlich).

Ein Schwellwert ist ein Bereich mit einem Alarmpegel (entweder Warning oder Critical).

In der Theorie wird das Plugin eine Prüfung durchführen, die einen numerischen Wert oder eine Metrik zurückliefert, die dann mit den Warning- und Critical-Schwellwerten verglichen wird

Dies ist das generelle Format für Bereiche:

[@]start:end

Anmerkungen:

  1. start = end, falls :end nicht angegeben ist

  2. start und ":" ist nicht erforderlich, wenn start=0

  3. falls der Bereich vom Format "start:" ist und end nicht angegeben wurde, dann ist das Ende als +Unendlich anzunehmen

  4. um -Unendlich anzugeben, benutzen Sie "~"

  5. Alarm erfolgt, wenn die Metrik außerhalb des durch Start- und Ende angegebenen Bereichs liegt (Endpunkte gehören nicht zum Bereich)

  6. wenn der Bereich mit "@" beginnt, dann ist zu alamieren, wenn die Metrik innerhalb des Bereichs liegt (einschließlich der Endpunkte)

[Anmerkung] Anmerkung

Nicht alle Plugin unterstützen (bisher) die Bereichsnotation.

Beispiele

Bereichsdefinition Alarm, wenn x...
10 < 0 oder > 10, (außerhalb des Bereichs von {0 .. 10})
10: < 10, (außerhalb {10 .. Unendlich})
~:10 > 10, (außerhalb des Bereichs von {-Unendlich .. 10})
10:20 < 10 oder > 20, (außerhalb des Bereichs von {10 .. 20})
@10:20 >= 10 and <= 20, (im Bereich von {10 .. 20})

Kommandozeilenbeispiele

Kommandozeile Erklärung
check_stuff -w10 -c20 kritisch, wenn "stuff" größer als 20, andernfalls warnen, wenn größer als 10 (außerdem kritisch, wenn "stuff" kleiner als 0)
check_stuff -w~:10 -c~:20 das Gleiche wie oben, allerdings ist "stuff" kleiner als Null OK!
check_stuff -w10: -c20 kritisch, wenn "stuff" größer als 20, andernfalls warnen, wenn"stuff" kleiner als 10 (außerdem kritisch, wenn "stuff" kleiner als 0)
check_stuff -c1: kritisch, wenn "stuff" kleiner als 1
check_stuff -w~:0 -c10 kritisch, wenn "stuff" größer als 10; warnen, wenn "stuff" größer als 0
check_stuff -c5:6 der einzig nicht-kritische Bereich ist 5:6
check_stuff -c@10:20 kritisch, wenn "stuff" zwischen 10 und 20 [1]
check_stuff -w20:30 -c10:40 warnen, wenn "stuff" kleiner als 20 oder größer als 30, kritisch, wenn "stuff" kleiner als 10 oder größer als 40 [2]
[Anmerkung] Anmerkung

[1]: Bei der Kommandozeile in den Entwickler-Richtlinien fehlt "@", anderenfalls wäre die Erklärung falsch (und es gäbe kein Beispiel für die @-Notation)

[2]: Bitte beachten Sie, dass das letzte Beispiel geschachtelte Bereiche benutzt. Das mag nicht bei allen Plugins funktionieren, die Bereichsangaben unterstützen. Es wurde mit check_snmp getestet

5.1.12. Aktivieren der Definition

Prüfen Sie die Konfiguration mit "/etc/init.d/icinga show-errors" und bereinigen Sie eventuelle Fehler, bevor Sie Icinga mit "/etc/init.d/icinga restart" neu starten. Warten Sie, bis das Objekt geprüft wurde und betrachten Sie die Status-Details. Vielleicht gibt es Fehler.

5.1.13. Plugin API

Informationen zu technischen Aspekten von Plugins sowie zur Erstellung Ihrer eigenen Plugins finden Sie hier.