自由帳

とりとめのない学習メモです。主に Web サービスのシステム基盤や運用に関することを書いています

ZabbixでのアラートをSlackに通知させる

Zabbixからの発生されるアラートをslackに通知させる設定についてのメモ書き。同様の記事はたくさんあるので不要な気もするし今更感もあるが...

やり方としては、Zabbix側にslackへの通知用のシェルスクリプトを設置し、アラートが発生した際にはそのシェルスクリプトを呼び出されるようにアクションを設定する。シェルスクリプト内部ではSlackのIncoming Webhooksで生成したURLに対して、Zabbixのアクション実行時に通知される内容をJSON形式のデータとしてPOSTで送ることで、該当のチャンネルへ内容が投稿される、という形。

実装概要

環境情報

実行環境としては Zabbix Server はバージョン3.4 で、Slackへの通知は当然ながら Incoming Webhooks を使う。

Incoming Webhooksの設定

まず、Zabbixからの通知を投稿するためのチャンネルをあらかじめ作成しておく。 続いてhttps://my.slack.com/services/new/incoming-webhook からIncoming WebhooksのURLを生成する。 通知したいチャンネルを指定するだけで以下のようなURLが生成されるのでこれをメモしておく。

https://hooks.slack.com/services///************************

その他細かい設定については下記のマニュアルを参照。

いったんこれだけでOK。

Zabbix側の設定

通知スクリプトの作成と設置

以下のようなslackへの通知用bashスクリプト(zabbix_to_slack.sh)を別途作成し、/usr/lib/zabbix/alertscripts/以下に設置する。 ※/usr/lib/zabbix/alertscripts/は環境によって異なるかもしれないので、Zabbixサーバの設定ファイル(zabbix_server.conf)のAlertScriptsPathに設定されているPATH場所に合わせてカスタムスクリプトを設置する。

#!/bin/bash

# * メディアタイプで設定した引数を受け取って、その内容をSlackに通知するスクリプト *

# Slack incoming web-hook URL
SLACK_WEBHOOKSURL='https://hooks.slack.com/services/*********/*********/************************'

# Slack UserName
SLACK_USERNAME='Zabbix(bot)'


# "Send to" for Zabbix User Media Setting 
NOTIFY_CHANNEL="$1"

# "Default subject" for Action Operations Setting
ALERT_SUBJECT="$2"

# "Default message" for Action Operations Setting
ALERT_MESSAGE="$3"

if [ "${ALERT_SUBJECT%%:*}" == 'OK' ]; then
        ICON=':smile:'
        COLOR="good"
elif [ "${ALERT_SUBJECT%%:*}" == 'PROBLEM' ]; then
        ICON=':skull:'
        COLOR="danger"
else
        ICON=':innocent:'
        ICON=':sushi:'
        COLOR="#439FE0"
fi

# Create JSON payload
PAYLOAD="payload={
    \"channel\": \"${NOTIFY_CHANNEL//\"/\\\"}\",
    \"username\": \"${SLACK_USERNAME//\"/\\\"}\",
    \"icon_emoji\": \"${ICON}\",
    \"attachments\": [
        {
            \"color\": \"${COLOR}\",
            \"text\": \"${ALERT_MESSAGE//\"/\\\"}\"
        }
    ]
}"

# Send it as a POST request to the Slack incoming webhooks URL
curl -m 5 --data-urlencode "${PAYLOAD}" $SLACK_WEBHOOKSURL
Zabbix管理画面へSlack通知用のメディアタイプ設定

Zabbix上でアラート通知先として使用される設定。 公式ドキュメントの通りにメディアタイプを作成する。

管理画面から以下のように遷移する。

画面上部のメニューから"管理(Administration)" → "メディアタイプ(Media types)" → "メディアタイプの作成(Create media type)"と遷移する

以下のような内容を入力する。 スクリプト名は、上記で作成したスクリプト名(本記事では zabbix_to_slack.sh)を入力する。

Parameter Description
名前(Name) zabbix_to_slack
タイプ(Type) スクリプト
スクリプト名(Script name) zabbix_to_slack.sh
スクリプトパラメータ(Script parameters#1) {ALERT.SENDTO}
スクリプトパラメータ(Script parameters#2) {ALERT.SUBJECT}
スクリプトパラメータ(Script parameters#3) {ALERT.MESSAGE}
有効(Enabled) チェックを入れる
Zabbix上のユーザのメディア設定(メディアタイプを指定)

Zabbix管理画面から新規または既存のユーザのメディア設定に、上記で作成したメディアタイプ(アラート通知先)を設定する。

画面上部のメニューから"管理(Administration)" → "ユーザー(Users)"と遷移する。 "ユーザの作成(Create User)"か既存ユーザを選択し、ユーザのプロパティの設定画面で"メディアタブ(Media tab)"を選択し、"追加(Add)"ボタンを押下する。

以下のような内容を入力する。 ※通知先チャネル名はIncoming Webhooksで設定したものとは別なものを指定しても良い。その場合そちらに通知が行く。

Parameter Description
タイプ(Type) zabbix_to_slack
送信先(Send to) 通知先チャネル名(シャープなし)
有効な時間帯(When active) 1-7,00:00-24:00
指定した深刻度のときに使用(Use if severity) すべてにチェック
有効(Enabled) チェックを入れる
アクションの設定

最後にアクションの設定を行う。 アクションは発生したイベントの結果に応じて実行する処理(アラート通知の送信など)の設定。

"設定(Configuration)" → "アクション(Actions)"と遷移する。 新規にアクションを作成するにしても既存のアクションの設定を変更するにしても、いずれにしても"実行内容(Operations)"タブを選択し、その中の"実行内容(Operations)"で、上記メディアを設定したユーザを追加し、忘れずに保存する。

確認

これでアラートが通知されるので適当にアラートを発生させて確認する。 以下のような感じでSlackへアラートが通知される。

おわりに

Zabbixのアラート発生時のアクションで、シェルスクリプトを実行させてSlackへ通知させる方法について書いた。

参考