Icinga2 ist eine praktische Sache, darüber braucht es vermeintlich keine Diskussionen. Eine einfache Lösung für die Darstellung von Performance-Daten ist PNP (ehemals PNP4Nagios). Nur ist diese Kombination bei Checks via nrpe oder by_ssh zunächst zickig.

Die dazugehörigen Links:

Wo das Problem dabei liegt? Jeder der diese Kombination am laufen hat wird die Erkenntnis getroffen haben, dass das Template welches PNP verwendet logischerwiese nrpe oder by_ssh lautet. Genau genommen logisch da der ausgeführte Check halt nun mal nrpe oder by_ssh heißt. Ok, dass die beiden so zunächst nur Mittelsmänner für den eigentlichen Check sind ist der Kombi Icinga2 und PNP an der Stelle schlichtweg egal…

Auf zur Lösung

Was kann man also tun? Man kann sich seine eigenen CheckCommands definieren die dann den passenden Namen haben und für diesen ein PNP Template hinterlegen. Das ist aber umständlich und macht zumindest mir wenig Spaß. Und das geht auch besser: Die PNP Templates werden in php geschrieben. Eine Programmiersprache… Also kann da auch Programmiercode mit rein welcher Entscheidungen trifft und nicht nur Layout entwirft…

Also fix ans Werk gemacht: PNP sieht als Check ja nur nrpe bzw. by_ssh. Woran erkenne ich was das für ein Check eigentlich war? Richtig, ein Blick in die zugehörige xml-Datei hilft. Da steht zum Beispiel die Datasource als auch der Name der rrd-Datei drin. Und letztere trägt den Namen des eigentlichen Checks. Bingo, Treffer: Schiff versenkt.

Uns so wird es gelöst: Ein Template namens by_ssh.php oder npre.php mit folgender Logik erstellt:

  • Ermitteln des Check-Namens anhand der verknüpften rrd-Datei
  • Suchen eines Templates mit Namen des Checks an den noch ein .php angefügt wurde
    • Gefunden? Dann dieses Template per php include einfügen und fertig
    • Nicht vorhanden? Dann einfach das Default Template einfügen

Fertig und funktioniert. Den Quellcode gibt es hier: https://gitlab.com/Gehirn-Mag.net/pnp-by_ssh-or-nrpe-template. Oder hier:

<?php

#
# A clever template for PNP which selects the correct template for by_ssh or 
# nrpe. Just rename or link the file to nrpe.php if needed ;-)
#

#
# MIT License
#
# Copyright (c) 2019 Steffen Schoch <mein@gehirn-mag.net>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#


// Adjust these both to your needs
$templatePath = '/etc/pnp4nagios/templates';
$templateDefault = '/usr/share/pnp4nagios/html/templates.dist/default.php'; 

// Check if template for the used rrd file exists
if(preg_match('/([^\\/]+)\\.rrd$/', $RRDFILE[1], $matches)) {
    // Some debug information if needed
    //throw new Kohana_exception(print_r($matches,TRUE));
    $templateFile = $templatePath . '/' . $matches[1] . '.php';
    if(is_file($templateFile)) {
        // template found, so use it
        include($templateFile);
    } else {
        // nothing found, use default template
        include($templateDefault);
    }
}

Einfach im PNP Template Ordner als by_ssh.php oder nrpe.php ablegen. Da eh gleicher Inhalt: Das kann verlinkt werden. Funktioniert logischerweise auch für alle anderen Templates mit gleichem Problem.

Mehr zum Thema Monitoring gefällig? Gibt es zum Beispiel hier: https://gehirn-mag.net/category/monitoring/.