Anleitung: Slack-Integration für Monit

slack-monit-integration

Slack hat die Kommunikation in Teams und Unternehmen verändert wie kein anderes Tool. Kein Wunder: Es ist auf allen Plattformen verfügbar, vielseitig einsetzbar und individuell anpass- und erweiterbar. Dabei ist Slack so viel mehr als nur eine Messaging- bzw. Kommunikationslösung: Slack ist IRC auf Steroiden. Auch Administratoren können davon profitieren, etwa mit der Anbindung des Server-Monitoring-Tools Monit.

Vorraussetzungen

Benötigt werden zunächst einmal zwei Komponenten bei denen ich davon ausgehe, dass ihr sie bereits einsetzt: Slack als Kommunikationslösung sowie Monit als Programm zur Überwachung eurer Server. Außerdem sind grundlegende Kenntnisse in Ruby empfehlenswert, auch wenn ihr das Skript zur Kommunikation mit Slack theoretisch auch in Bash oder PHP schreiben könnt – mehr dazu aber später.

1. Neuen Slack-Channel anlegen

Zunächst benötigt ihr einen neuen Slack-Channel, der die späteren Benachrichtigungen des Monit-Bots empfängt. Ob dieser Channel öffentlich oder privat ist obliegt eurer Entscheidung. Andere Teilnehmer können in beiden Fällen später immer noch hinzugefügt werden.

create-slack-channel

2. Neuen WebHook für Slack anlegen

Im Bereich Configure Apps legt ihr nun im Bereich Custom Integrations einen neuen Incoming WebHook an und wählt den zuvor erstellen Channel als Ziel.

create-slack-webhook

Nach dem Anlegen des WebHooks erhaltet ihr die Möglichkeit den Namen sowie das Symbol, unter dem die eingehenden Nachrichten im Channel angezeigt werden, anzupassen. Außerdem wird euch die URL angezeigt, die ihr später benötigt um Statusmitteilungen an Slack senden zu können.

webhook-settings-slack

3. Skript zur Kommunikation von Monit zu Slack

Wie schon unter zuvor angedeutet, benötigt ihr ein Skript, dass zur Kommunikation zwischen Monit und Slack dient. Im Prinzip handelt es sich dabei um ein paar wenige Zeilen Code, die den WebHook von Slack unter der angegebenen URL aufrufen und die Statusmeldungen von Monit als Payload übermitteln. In meinem Beispiel handelt es sich um ein in Ruby geschriebenes Skript, prinzipiell kann dies jedoch in jeder auf dem Server verfügbaren Programmiersprache und sogar mit einem einfachen Aufruf mittels cURL erfolgen.

Hinterlegt in den Zeilen 5-7 die Webhook URL, den Namen des Channels (inkl. Raute) sowie den Namen des Bots und speichert die Datei unter /usr/local/bin/monit_slack.rb ab.

#!/usr/bin/ruby
require "net/https"
require "json"
webhook = ""
channel = ""
username = ""
webhook = URI.parse(webhook)
http = Net::HTTP.new(webhook.host, webhook.port)
http.use_ssl = true
request = Net::HTTP::Post.new(webhook.request_uri, {"Content-Type" => "application/json"})
request.body = {
"channel" => channel,
"username" => username,
"text" => "[#{ENV['MONIT_HOST']}] #{ENV['MONIT_SERVICE']} - #{ENV['MONIT_DESCRIPTION']}"
}.to_json
http.request(request)

Danach macht ihr die Datei mit dem Befehl chmod +x /usr/local/bin/monit_slack.rb ausführbar und ruft sie anschließend mit dem Befehl /usr/local/bin/monit_slack.rb auf, um zu überprüfen ob der WebHook funktioniert. Wenn alles geklappt hat, sollte nun eine Nachricht in Form von [] – im angegebenen Slack-Channel zu finden sein.

Hinweis: Da das Skript nicht von Monit aufgerufen wurde, sind die Umgebungsvariablen MONIT_HOST, MONT_SERVICE sowie MONIT_DESCRIPTION leer und somit wird auch kein echter Status angezeigt.

4. Implementierung des Skriptes in Monit

Da Monit eine Vielzahl von Möglichkeiten bietet, wenn es darum geht Server, Dienste oder Dateien zu überwachen, obliegt es euch zu entscheiden in welchen Fällen der Bot Statusmitteilungen an Slack versendet. Wenn ihr bereits E-Mail-Alerts angelegt habt, würde ich euch empfehlen diese Mitteilungen ebenfalls an Slack zu senden. Ebenso vorstellbar wäre, komplett auf diese Benachrichtigungen zu verzichten und künftig alles an den Slack-Channel berichten zu lassen. Grundsätzlich rate ich euch aber immer zur Redundanz: E-Mail-Benachrichtigung plus Slack-Integration. Sollte eines der genannten Systeme ausfallen, bleibt immerhin noch ein Kanal als Fallback übrig.

Der Vollständigkeit halber ein kleines Beispiel, wie genau das Skript in einer Monit-Konfigurationsdatei aufgerufen werden könnte:

check system localhost
if memory usage > 75% for 5 cycles then exec /usr/local/bin/monit_slack.rb else if succeeded then exec /usr/local/bin/monit_slack.rb

Zusammenfassung

Das Ruby-Skript und die Beispielkonfiguration für Monit findet ihr in diesem Gist.

Viel Spaß!

Hinterlasse einen Kommentar