Zabbix - Template with application [Processes] already linked to host

Ein seit Jahren bekanntes Problem beim Servermonitoring mit Zabbix ist, dass man nicht mehrere Templates mit identischen Applications auf den gleichen Host linken kann. Manche betrachten dies nicht als Bug, da sie der Meinung sind, dass die Applications wirklich pro Template eindeutig sein sollten - deshalb wird dieser Bug auch scheinbar nicht behoben. Wenn man aber seine Templates so aufbaut, dass man in einem Template nur grundlegende Items/Trigger hat und man dann je nach Server weitere spezialisierte Templates hinzulinkt, dann stößt man regelmäßig auf obiges Problem. Die gängigen Fehlermeldungen können entsprechend den Standard-Applications und eigenen Anpassungen daran variieren. Die wichtigsten habe ich am Ende dieses Artikels aufgeführt. Die einfachste Lösung ist, entweder keine Applications zuzuweisen oder wirklich in jedem Template andere - hat man aber User, die die Apllications-Ansicht gerne nutzen, geht das nicht.

Man sollte sich natürlich im Klaren darüber sein, dass man mit dem mehrfachen Linken der gleichen Applications Schwierigkeiten beim Entfernen von Templates erzeugt - die Applications dürfen schließlich nicht mehr einfach so gelöscht werden. Doch damit sollte man leben können und zur Not kann man die MySQL-Datenbank manuell nachbearbeiten oder bei Änderungen die betreffenden Hosts komplett löschen und neu anlegen.

Um nun die Problematik durch einen Bugfix zu umgehen, finden sich einige Patche im Netz. Allerdings sind die meist spezifisch auf eine bestimmte Zabbix-Version bezogen und lassen sich daher nicht automatisch auf spätere Versionen anwenden. Für eine allgemeine Lösung muss man nur zwei Dateien (bis etwa zur Version 1.8.2 genügte die erste Datei) anpassen, was im Folgenden beschrieben wird.

In der Datei [PathToZabbix-Frontend]/api/classes/class.ctemplate.php sucht man die Funktion private static function link($templateids, $targetids), welche bei Zabbix 1.8.6 in Zeile 1541 beginnt. Einige Zeilen tiefer steht der Kommentar
// check if any templates linked to targets have more than one unique item key/application
Das darauf folgende foreach($targetids as $targetid){ … } mit seinen zwei SQL-Abfragen kommentiert man einfach komplett aus und schon findet die lästige Überprüfung nicht mehr statt.

In der Datei [PathToZabbix-Frontend]/include/hosts.inc.php sucht man die Funktion function validate_templates($templateid_list), welche bei Zabbix 1.8.6 in Zeile 1552 beginnt. In dieser Funktion befinden sich zwei DB-Abfragen. Die erste Abfrage checkt auf duplicate Items, die zweite auf das uns störende duplicate applications. Also wird schlicht die zweite Abfrage vollständig $sql = … } (wobei mit der geschweiften Klammer die zum while gehörende gemeint ist) auskommentiert.

Fügt man jetzt die gewünschten zusätzlichen Teplates hinzu, kommt keine Meldung mehr. Nach dem Klick auf Save erscheint die übliche ausklappbare Übersicht mit dem Titel Host updated. In selbiger tauchen dann auch wieder kleine Fehlermeldungen im Stil Application ‘Processes’ already exists auf, welche man schlicht ignorieren kann.

Häufige Fehlermeldungen ohne Deaktivierung der Überprüfung:
Template with application [CPU] already linked to host
Template with application [Filesystem] already linked to host
Template with application [General] already linked to host
Template with application [Memory] already linked to host
Template with application [Network] already linked to host
Template with application [Performance] already linked to host
Template with application [Processes] already linked to host

Einen Kommentar schreiben