Mein erstes Icinga2 Plugin

Icinga2 ist eine Monitoring Anwendung, deren Hauptzweck es ist, definierte Services von bestimmten Hosts zu überwachen. Die jeweiligen Fehlermeldungen können unter anderem auf der Website, aber auch per Mail (falls eingerichtet), überblickt werden. Icinga stellt Plugins wie ssh, Festplattenüberprüfung etc. bereit, es können aber auch eigenständig Plugins erstellt werden. Plugins können Skripte sein (Shell, Python, Perl, Ruby, PHP, etc.) aber auch kompilierte Binaries geschrieben in C, C++, Go, etc. Ich wollte schon lange mein eigenes Plugin schreiben und dies habe ich mit diesem Artikel nun vollzogen. Dabei habe ich mich bei Shell bedient und mein QNAP TS-212 NAS als Hosts benutzt, gegen den ich die Checks laufen lasse.

Oben seht ihr, die Ausgabe des Plugins im Webinterface. Bis jetzt enthält das Plugin die Checks für HDTemps, SysTemps, HDSmartStatus, HDCapacity und Volumestatus. Für jede einzelne Festplatte wird dabei die Temperatur und der Smart Status erfasst. Falls erforderlich muss ein Warn- und kritische Schwelle angegeben werden. Für die Integration, ist eine checkCommand, wie unten angegeben, erforderlich.

object CheckCommand "nas" {
  command = [ PluginDir + "/nas.sh"]
  arguments = {
   "-h" = {
        value = "$host.address$"
        description = "Hostname of the remote machine"
        }
   "-u" = {
        value = "$nas_username$"
        description = "Username for ssh Login"
        }
   "-w" = {
        value = "$nas_wload$"
        description = "Exit with WARNING Status if limit exceeds wload"
        }
   "-c" = {
        value = "$nas_cload$"
        description = "Exit with CRITICAL Status if limit exceeds wload"
        }
   "-m" = {
        value = "$nas_mode$"
        description = "mode for specific reports"
        }
   "-p" = {
        value = "$nas_port$"
        description = "ssh Port to connect to(default 22)"
        }
  }

  vars.nas_wload = 80
  vars.nas_cload = 95
}

80 ist die Warnschwelle für eine Nachricht, während 95 dasselbe für den kritischen Part ist.

Service Objekt

Zur Vereinfachung hänge ich die Services den Hosts an, die host.vars.nas_username gesetzt haben. Maßgeblich erforderlich ist dabei „assign where“. Als Beispiel sieht der Kapazitäten Check so aus:

apply Service "storage" {
  import "generic-service"
  check_command = "nas"

  vars.nas_mode = "CAPACITY"
  vars.nas_wload = 80
  vars.nas_cload = 90
  assign where host.vars.nas_username != ""

}

Mit check_command = „nas“ rufen wir das vorher definierte CheckCommand Objekt mit demselben Namen auf. Nas_mode muss dabei immer gesetzt werden. Um alle möglichen Optionen zu sehen, kann das Script im Terminal aufgerufen werden.

pi@raspberrypi:/usr/lib/nagios/plugins $ ./nas.sh --help

nas, version 2020.10.19
 
Usage: ./nas.sh [OPTIONS]
Option  GNU long option         Meaning
------  --------------- -------
 
 -q     --help          Show this message
 -v     --version       Print version information and exit
 -h     --hostname      set hostname/IP     
 -u     --username      set username
 -p     --port          set Port default(22)
 -c     --critical      set critical value
 -w     --warning       set warning value
 -m     --mode          CAPACITY,BACKUP,VOLUME,SYSTEMP,HDTEMPS,HDDSTATUS

Hier seht ihr ein weiteres Beispiel, wie die Festplattentemperatur überwacht werden könnte:

apply Service "HDtemp" {
  import "generic-service"
  check_command = "nas"

  vars.nas_mode = "HDTEMPS"
  vars.nas_wload = 50
  vars.nas_cload = 55

 assign where host.vars.nas_username != ""
}

Host Objekt

Mein NAS hat die Variable nas_username = “admin” in seinem Host Objekt. Somit werden die Services diesem Host zugewiesen.

object Host "nas" {
        import "generic-host"

        address = "192.168.188.30"
        check_command = "hostalive"
        vars["os"] = "Linux"
        version = 1596033350.202298
        zone = "raspberrypi"
        vars.nas_username = "admin"

        /* Define notification mail attributes for notification apply rules in `notifications.conf`. */
        vars.notification["mail"] = {
                /* The UserGroup `icingaadmins` is defined in `users.conf`. */
                groups = [ "icingaadmins" ]
        }

}

Damit all diese Informationen aufgerufen werden können, benutze ich den internen command getsysinfo. Stellt also sicher, dass dieser auf eurem QNAP enthalten ist.

Der komplette Code ist auf meinem github repository gespeichert. Schaut dort mal vorbei, wenn ihr Lust habt. https://github.com/stevieWoW/NAS-QNAP-ICINGA2

Das Plugin erfordert ein ssh Tunnel zum Nas System. Damit der Check automatisch ausgeführt werden kann, solltet ihr eine privat/öffentliche Relation zwischen icinga2 und dem Nas aufbauen. Erstellt dafür einfach einen ssh key mit eurem nagios Account und fügt diesen zu den autorisierten Hosts auf eurem Nas hinzu.  

Ich bin froh über jedes Feedback zu meinem Plugin 😊

Schreibe einen Kommentar

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