Integration von Zabbix und GLPI: automatische Erstellung von Tickets

Wie NexTool Zabbix und GLPI verbindet, um Tickets mit Verantwortlichem, Priorität und SLA zu erstellen und sie beim Recovery selbstständig zu schließen: Webhook-Media-Type, Zuordnung der Schweregrade und Idempotenz per event_id gegen Ticketstürme.

In diesem Artikel7 Abschnitte

Ein Alarm, der nur per E-Mail ankommt, ist eine Störung ohne Verantwortlichen. Die Integration zwischen Zabbix und GLPI dient dazu, jedes erkannte Problem in ein nachverfolgbares Ticket zu verwandeln, mit Nummer, Verantwortlichem, Kategorie, Priorität und SLA, und es selbstständig zu schließen, wenn Zabbix die Wiederherstellung bestätigt. Ein Geheimnis liegt nicht darin, „ein Ticket zu erstellen“, sondern darin, keine vierzig zu erstellen.

Was die Integration leisten muss

Eine Brücke von Zabbix zu GLPI, die in Produktion trägt, braucht vier Garantien, nicht nur „ein Ticket posten“:

  • Idempotenz: Ein Problem erzeugt ein Ticket, nicht eines pro Eskalationsschritt.
  • Korrelation von Problem und Wiederherstellung: Ein Recovery-Ereignis muss genau jenes Ticket finden und schließen, welches eröffnet wurde.
  • Zuordnung der Schweregrade: Der Schweregrad aus Zabbix wird einheitlich zur Priorität in GLPI, ohne dem Ermessen jedes Analysten überlassen zu sein.
  • Ausreichender Kontext: Host, IP, Trigger, Uhrzeit und Meldung im Text, damit ein Analyst handeln kann, ohne Zabbix öffnen zu müssen.

Architektur: wo der Webhook zum Ticket wird

Zabbix löst über eine Action aus; die Action führt eine Medienoperation vom Typ Webhook aus; der Webhook ist ein natives JavaScript-Skript von Zabbix, welches einen POST an einen Endpunkt auf der Seite von GLPI sendet. Auf der Seite von GLPI verwenden wir den Receiver des Moduls Automations, der die HMAC-Signatur prüft, die Feldzuordnung anwendet und ein Ticket erstellt (oder schließt). Wir vermeiden es, die REST-API von GLPI direkt aus Zabbix aufzurufen, weil jeder Aufruf ein Paar aus app-token/user-token und ein Paar initSession/killSession erfordern würde; bei einem Alarmsturm hämmert dies auf die API ein und erschöpft zudem die Sitzungen.

Artefakt: Webhook-Media-Type von Zabbix

Die Parameter bilden Makros des Ereignisses ab; ein Skript baut den Payload und behandelt den HTTP-Code. Problem und Wiederherstellung verwenden denselben Media Type; Feld event_value unterscheidet sie (1 = Problem, 0 = Wiederherstellung):

// Zabbix -> Media type -> Webhook -> Parameters
// endpoint     = https://glpi.customer.com/plugins/nextool/automations/webhook/zabbix
// event_id     = {EVENT.ID}        // stable across the problem/recovery pair
// event_value  = {EVENT.VALUE}     // 1 = problem, 0 = recovery
// host_name    = {HOST.NAME}
// host_ip      = {HOST.IP}
// trigger_name = {TRIGGER.NAME}
// severity     = {TRIGGER.SEVERITY}
// occurred     = {EVENT.DATE} {EVENT.TIME}
// message      = {ALERT.MESSAGE}
// hmac         = {$NEXTOOL_HMAC}    // secret macro, never in the alert body

var p = JSON.parse(value);
var req = new HttpRequest();
req.addHeader('Content-Type: application/json');
req.addHeader('X-Nextool-Signature: ' + p.hmac);

var payload = JSON.stringify({
    event_id: p.event_id,
    recovery: p.event_value === '0',
    host:     p.host_name,
    host_ip:  p.host_ip,
    trigger:  p.trigger_name,
    severity: p.severity,
    occurred: p.occurred,
    message:  p.message
});

var resp = req.post(p.endpoint, payload);
var code = req.getStatus();
if (code < 200 || code >= 300) {
    Zabbix.log(3, '[nextool] HTTP failure ' + code + ': ' + resp);
    throw 'Send to GLPI failed: HTTP ' + code;
}
return resp;

Zuordnung der Schweregrade von Zabbix zur Priorität in GLPI

Zabbix hat sechs Schweregrade, GLPI fünf Prioritäten. Wir legen die Zuordnung im Receiver fest, um sie nicht dem Ermessen jedes Analysten zu überlassen:

Schweregrad in ZabbixPriorität in GLPIWird zum Ticket?
Not classified / Information-Nein (nur Protokoll)
WarningNiedrigJa
AverageMittelJa
HighHochJa
DisasterSehr hochJa + Benachrichtigung der Bereitschaft

Deduplizierung und automatisches Schließen

An diesem Punkt trennt sich eine Spielzeug-Integration von einer, die Produktion aushält. Beim Erstellen eines Tickets speichert der Receiver die tickets_id aus GLPI als Tag des Ereignisses in Zabbix (oder in einer nach event_id indizierten Korrelationstabelle). Wenn Zabbix das Recovery mit derselben event_id sendet, findet der Receiver jenes Ticket und fügt eine Folgeaktion zur Wiederherstellung hinzu oder schließt es, je nach Richtlinie des Kunden. Ohne diesen Schlüssel weiß ein Recovery nicht, welches Ticket es schließen soll, und es sammeln sich offene Tickets zu bereits gelösten Problemen an.

Häufige Fehler, die wir im Betrieb korrigieren

Im Betrieb ist die häufigste Störung nicht der Alarm, der nicht zum Ticket wird, sondern der Alarm, der zu vierzig wird. Eine flappende Schnittstelle um 3 Uhr morgens erzeugte Dutzende identische Tickets, weil die Action bei jedem Eskalationsschritt auslöste und der Receiver nicht deduplizierte. Die Korrektur hat zwei Seiten: in Zabbix Trigger-Abhängigkeit, Hysterese im Recovery-Ausdruck und eine Medienoperation nur im ersten Schritt; in GLPI Idempotenz per event_id. Zwei weitere wiederkehrende Fehler: die Kategorie eines Tickets als Freitext zu senden (GLPI erwartet eine numerische itilcategories_id; ein neuer Text passt nicht, und ein Ticket landet ohne Kategorie) und ein HMAC-Secret in den Text des Alarms zu schreiben statt in ein geschütztes Makro wie {$NEXTOOL_HMAC}.

Integrationsmethoden im Vergleich

MethodeOhne Code?Dedup/RecoveryWann verwenden
Modul Automations (Receiver)Ja (Zuordnung per JSONPath)Nativ per event_idStandard für die meisten Kunden
REST-API von GLPI direktNeinSie implementieren es selbstOhne das Modul; wenige Hosts
Externes Skript (Python/Bash)NeinSie implementieren und pflegen es selbstGeschäftsregeln außerhalb des Standards

Wenn Ihr Betrieb bereits Zabbix nutzt, die Alarme aber in einem Postfach versanden, welches niemand liest, setzt NexTool diese Brücke mit Modul Automations um und hält die Regeln im Betrieb fein abgestimmt: Trigger, Zuordnung der Schweregrade und Richtlinie für das Schließen. Lernen Sie das Modul Automations kennen.


Geprüft vom Team von NexTool Solutions.

Häufig gestellte Fragen

Ja. Eine Action von Zabbix führt einen Webhook (Media Type) aus, der einen POST an den Receiver des Moduls Automations in GLPI sendet. Derselbe Media Type behandelt Problem und Wiederherstellung: Beim Problem erstellt er ein Ticket; beim Recovery fügt er, korreliert über event_id, je nach Richtlinie eine Folgeaktion hinzu oder schließt es.

Auf zwei Ebenen. In Zabbix: Trigger-Abhängigkeit, Hysterese im Recovery-Ausdruck und eine Medienoperation nur im ersten Eskalationsschritt. In GLPI: Idempotenz per event_id, wobei tickets_id als Tag des Ereignisses gespeichert wird, damit erneute Sendungen dasselbe Ticket aktualisieren, statt neue zu erstellen.

Nicht unbedingt. Mit Modul Automations ordnen Sie die Felder des Payloads aus Zabbix per JSONPath den Feldern von GLPI zu, ohne Code. Die direkte REST-API oder ein externes Skript (Python/Bash) sind Alternativen, erfordern aber, dass Sie Deduplizierung und Recovery selbst implementieren und pflegen.

Zabbix hat sechs Schweregrade und GLPI fünf Prioritäten. Wir legen die Zuordnung im Receiver fest: Warning wird zu Niedrig, Average zu Mittel, High zu Hoch, und Disaster wird zu Sehr hoch und benachrichtigt zusätzlich die Bereitschaft. Not classified und Information erzeugen in der Regel nur einen Protokolleintrag, ohne ein Ticket zu erstellen.

Jeder Aufruf der REST-API erfordert ein Paar aus app-token/user-token und einen Zyklus initSession/killSession. Bei einem Alarmsturm hämmert dies auf die API ein und erschöpft die Sitzungen. Der Receiver des Moduls Automations akzeptiert einen per HMAC signierten Webhook an einem einzigen Endpunkt, ohne die Kosten, bei jedem Ereignis eine Sitzung zu öffnen und zu schließen.

Brauchen Sie Hilfe?