Zabbixからの発生されるアラートをslackに通知させる設定についてのメモ書き。同様の記事はたくさんあるので不要な気もするし今更感もあるが...
やり方としては、Zabbix側にslackへの通知用のシェルスクリプトを設置し、アラートが発生した際にはそのシェルスクリプトを呼び出されるようにアクションを設定する。シェルスクリプト内部ではSlackのIncoming Webhooksで生成したURLに対して、Zabbixのアクション実行時に通知される内容をJSON形式のデータとしてPOSTで送ることで、該当のチャンネルへ内容が投稿される、という形。
実装概要
環境情報
実行環境としては Zabbix Server はバージョン3.4 で、Slackへの通知は当然ながら Incoming Webhooks を使う。
- Zabbix Server 3.4
- Incoming Webhooks | Slack
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へ通知させる方法について書いた。