Zammad - check_mk Integration

Es gibt zwei Möglichkeiten um check_mk dazu zu verwenden bei Problem Events Zammad Tickets zu öffnen und bei Recovery Events diese wieder zu schließen.

Notification E-Mails an den Zammad E-Mail Kanal

Eine Möglichkeit ist, in der WATO Configuration unter dem Menüpunkt Users einen User mit der E-Mail Adresse des gewünschten E-Mail Kanals anzulegen und diesen in der gewünschten Contact Group aufzunehmen.

Zammad User in WATO anlegen
Zammad User in WATO anlegen

Der Login für diesen User kann disabled werden.

In der Zammad GUI muss unter dem Menüpunkt Integration die check_mk Integration aktiviert und nach Bedarf angepasst werden.

check_mk Integration in Zammad aktivieren
check_mk Integration in Zammad aktivieren

Wenn check_mk an die angegebene E-Mailadresse einen Problem Alert sendet, eröffnet Zammad ein Ticket und schließt es wieder, wenn von check_mk die Recovery Meldung kommt.

Tickets via curl POST erzeugen

Die andere Möglichkeit ist, einen eigenen Notification Typ zu konfigurieren.

Da sich die Service Beschreibung der Service Notification von der Host Notification unterscheidet, empfiehlt es sich zwei verschiedene Tpyen zu Konfiguieren. Dazu müssen die Scripte im entsprechenden omd Verzeichnis der jeweiligen site mit folgendem Inhalt erstellt werden:

Service Notification

/opt/omd/site/SITENAME/local/share/check_mk/notifications/zammad-service

#!/bin/bash
# Zammad Service Notification

# Filter Zammad URL
zammad_url=$(echo $NOTIFY_PARAMETER_1 | cut -d '/' -f 1,2,3,4,5)

# Create Ticket
ticket_id=$( curl -X POST -F "event_id=$NOTIFY_SERVICEPROBLEMID" -F "host=$NOTIFY_HOSTNAME ($NOTIFY_HOSTALIAS)" -F "service=$NOTIFY_SERVICEDESC" -F "state=$NOTIFY_SERVICESTATE" -F "text=$NOTIFY_SERVICEOUTPUT" $NOTIFY_PARAMETER_1 | jq '.ticket_id' )

if [ $NOTIFY_SERVICESTATE != "OK" ]; then
  # Build i-doit query
  idoit_query='{"jsonrpc":"2.0","method":"cmdb.objects.read","params":{"filter": {"title": "'$NOTIFY_HOSTNAME'"},"apikey":"'$NOTIFY_PARAMETER_5'"},"id":1}'

  # Search i-doit Object
  idoit_obj_id=$( curl -u $NOTIFY_PARAMETER_6:$NOTIFY_PARAMETER_7 --data "${idoit_query}" --header "Content-Type: application/json" {$NOTIFY_PARAMETER_4}/src/jsonrpc.php | jq  '.result | .[0] | .id' )

  # Filter i-doit Object id
  temp="${idoit_obj_id%\"}"
  idoit_obj_id="${temp#\"}"

  # Build Ticket update query
  update_query='{"title":"'$NOTIFY_HOSTNAME' ('$NOTIFY_HOSTALIAS') Service '$NOTIFY_SERVICEDESC' is '$NOTIFY_SERVICESTATE'", "preferences" : { "idoit": {"object_ids": ["'${idoit_obj_id}'"]}}}'

  # Update Ticket
  update=$( curl -u $NOTIFY_PARAMETER_2:$NOTIFY_PARAMETER_3 -H "Content-Type: application/json" -H "X-On-Behalf-Of: ${NOTIFY_PARAMETER_2}" -X PUT -d "${update_query}" ${zammad_url}/tickets/${ticket_id} )
  # If "Update Ticket" not work use this
  #update=$( curl -u $NOTIFY_PARAMETER_2:$NOTIFY_PARAMETER_3 -H "Content-Type: application/json" -X PUT -d "${update_query}" ${zammad_url}/tickets/${ticket_id} )

fi
exit 0

Host Notification

/opt/omd/site/SITENAME/local/share/check_mk/notifications/zammad-host

#!/bin/bash
# Zammad Host Notification

# Filter Zammad URL
zammad_url=$(echo $NOTIFY_PARAMETER_1 | cut -d '/' -f 1,2,3,4,5)

# Create Ticket
ticket_id=$( curl -X POST -F "event_id=$NOTIFY_HOSTPROBLEMID" -F "host=$NOTIFY_HOSTNAME ($NOTIFY_HOSTALIAS)" -F "service=$NOTIFY_SERVICEDESC" -F "state=$NOTIFY_HOSTSTATE" -F "text=$NOTIFY_HOSTOUTPUT" $NOTIFY_PARAMETER_1 | jq '.ticket_id' )

# Build i-doit query
idoit_query='{"jsonrpc":"2.0","method":"cmdb.objects.read","params":{"filter": {"title": "'$NOTIFY_HOSTNAME'"},"apikey":"'$NOTIFY_PARAMETER_5'"},"id":1}'

# Search i-doit Object
idoit_obj_id=$( curl -u $NOTIFY_PARAMETER_6:$NOTIFY_PARAMETER_7 --data "${idoit_query}" --header "Content-Type: application/json" {$NOTIFY_PARAMETER_4}/src/jsonrpc.php | jq  '.result | .[0] | .id' )

# Filter i-doit Object id
temp="${idoit_obj_id%\"}"
idoit_obj_id="${temp#\"}"

# Build Ticket update query
update_query='{"preferences" : { "idoit": {"object_ids": ["'${idoit_obj_id}'"]}}}'

# Update Ticket
update=$( curl -u $NOTIFY_PARAMETER_2:$NOTIFY_PARAMETER_3 -H "Content-Type: application/json" -H "X-On-Behalf-Of: ${NOTIFY_PARAMETER_2}" -X PUT -d "${update_query}" ${zammad_url}/tickets/${ticket_id} )
# If "Update Ticket" not work use this
#update=$( curl -u $NOTIFY_PARAMETER_2:$NOTIFY_PARAMETER_3 -H "Content-Type: application/json" -X PUT -d "${update_query}" ${zammad_url}/tickets/${ticket_id} )

exit 0

Damit diese Scripte funktionieren, muss der JSON Processor jq installiert sein.

und ausführbar gemacht werden:

# chmod +x local/share/check_mk/notifications/zammad-service local/share/check_mk/notifications/zammad-host

Danach muss check_mk neu gestartet werden:

# omd restart site

Nun stehen die Notification Typen Zammad Service und Zammad Host in der WATO Oberfläche zur Verfügung.

Auch für diese Methode sollte ein Zammad User ohne Login verwendet werden, allerdings ohne E-Mailadresse.

Nun kann in der WATO Oberfläche unter dem Menüpunkt Notifications eine neue Notification Rule konfiguriert werden. Bei der Notification Method wählt man zammad-service aus, wählt im Dropdown die Option Call with the following Parameters und trägt in darunterligenden Feldern der Reihe nach folgende Parameter ein:

  1. URL von Zammad inkl. Authentifizierungstoken, wie er bei der Konfiguration der check_mk Integration in Zammad angezeigt wurde;
  2. Zammad User (E-Mail)
  3. Zammad Pass
  4. i-doit URL (ohne /src/json.php)
  5. i-doit API Key
  6. i-doit User
  7. idoit Pass
In WATO eine Zammad Service Notification Rule konfigurieren
In WATO eine Zammad Service Notification Rule konfigurieren

In der Sektion Contact Selection sorgt die markierte Checbox The following users und die Einschränkung auf den User Zammad dafür, dass das Script nur einmal aufgerufen wird, statt für jeden zu benachrichtigenden User.

Damit nur Service Notification's erstellt werden, wählt man unter Conditions "Match service event type" aus.

In WATO eine Zammad Service Notification Rule konfigurieren (Conditions)
In WATO eine Zammad Service Notification Rule konfigurieren (Conditions)

Für die Host Notification kann die Service Notification kopiert werden, man wählt als Notificaton Method zammad-host aus und konfiguiert als Condition "Match host event type".

In WATO eine Zammad Host Notification Rule konfigurieren
In WATO eine Zammad Host Notification Rule konfigurieren
In WATO eine Zammad Host Notification Rule konfigurieren (Conditions)
In WATO eine Zammad Host Notification Rule konfigurieren (Conditions)