Zabbix 5.0 LTS では Slack への通知にネイティブで対応しているので、 使ってみようとしたところ、 はまりどころが多かったのですが、 使えるようになったので、そのメモです
動作確認環境
- Raspbian GNU/Linux 10 (buster)
- zabbix-server-pgsqlなど 1:5.0.1-1+buster (https://www.zabbix.com/jp/download の方法でインストールしたもの)
Slack トークン作成
https://www.zabbix.com/integrations/slack の情報は古いままのようで、 アプリを作成するなら、 今は OAuth の Scope を選ぶ必要がありました。
Incoming Webhook アプリ と同様に Bots アプリ を使うと、 連携アプリ数を抑えて他 (ruboty など) と共有して使えるようです。
別アプリを作るなら Scope は https://www.reddit.com/r/zabbix/comments/f9udjv/slack_integration/ に書いてあるように chat:write と incoming-webhook が必要でした。
xoxb- で始まる文字列が bot 用のトークンになります。
今回は関係ないのですが、 Token types によると xoxp- が User tokens (クライアントアプリを作る時などに使う) で、 他には Workspace tokens などもあるようです。
チャンネルにアプリを追加
チャンネルの右上の「詳細」の「その他」の「アプリを追加する」などから、 通知を出したいチャンネルにアプリを追加しておきます。
グローバルマクロ設定
「管理」の「一般設定」から「マクロ」を開いて、以下のように Zabbix の URL のベース部分を設定しておきます。
- マクロ:
{$ZABBIX.URL} - 値:
http://127.0.0.1/zabbix/のような zabbix の URL - 説明:
For Slack media typeなど適当に設定
bot token もメディアタイプの方に埋め込みたくないなら、ここで設定しておきます。
- マクロ:
{$SLACK_BOT_TOKEN} - 値:
xoxb-で始まる文字列 - 説明: 適当に設定
Slack メディアタイプのインポート
古いバージョンからのアップグレードで Slack メディアタイプがない場合は https://www.zabbix.com/integrations/slack の途中に書いてあるように、 「管理」の「メディアタイプ」で media_slack.xml をインポートすれば良いようです。
スクリプトにかなりのロジックが入っているようですが、 Slack という変数をみていて、 この定義はスクリプトの中になくて、 Zabbix 本体側で持っているようで、 全てスクリプトで実装しているわけではなさそうでした。
トークンのテスト
「管理」の「メディアタイプ」の右の「アクション」の列にある「テスト」からテストできます。
-
bot_tokenにxoxb-で始まる文字列を入れます。テストではマクロは展開されないようなので、直接入れる必要があります。 - 「メディアタイプのテストに失敗しました。」で
Slack notification failed : Field "event_id" is not a numberのようにマクロのままだとダメなフィールドがわかるので、適当に 1 などに書き換えていきます。 - 最終的に
event_id,event_nseverity,event_update_status,event_value,trigger_idを 1 にしました。 - zabbix_url はグローバルマクロで
{$ZABBIX.URL}を設定していてもSlack notification failed : Field "zabbix_url" must contain a schemaとなるのでhttp://127.0.0.1/zabbix/としました。
最後はチャンネル名が問題です。
-
{ALERT.SENDTO}のままだとSlack notification failed : channel_not_foundになります。 - プライベートチャンネルなどの bot のアカウントで存在が確認できないチャンネルも
channel_not_foundになります。 - パブリックチャンネルでアプリが追加されていないと
Slack notification failed : not_in_channelになります。
チャンネルにアプリを追加しておくと「メディアタイプのテストに成功しました。」となって Slack 側に投稿されているのを確認できます。
通知設定
- メディアタイプ Slack を開いて
bot_tokenを設定します。グローバルマクロに設定したなら{$SLACK_BOT_TOKEN}も使えます。 - https://www.zabbix.com/integrations/slack によると
slack_modeはalarmの他にeventを設定できるようです。 - メッセージテンプレートも必要なようなので、なければ設定しておきます。内容にこだわりがなければ追加で必要なメッセージタイプをテンプレート側はそのままで追加していけば良さそうです。
- 次に「管理」の「ユーザー」から対象ユーザーを開いて「メディア」でタイプ Slack を追加して、送信先を設定します。 https://www.zabbix.com/integrations/slack によると、送信先には
#channel_name,@slack_user, またはGQMNQ5G5Rのような ID が使えるらしいです。 - 最後に「設定」の「アクション」でメッセージの送信の設定をします。 ここでメッセージのカスタマイズにチェックが入っていて、件名とメッセージが設定されていれば、メディアタイプ側でメッセージテンプレートがなくても通知されそうです。
感想
最初は https://www.zabbix.com/integrations/slack にしたがって独自アプリ作成を試していて、スコープの設定を試行錯誤するなど大変だったのですが、 一通り動作確認が終わった後に Bots でもいけるとわかって、 アプリ数を減らすことができました。
bot token も最初はグローバルマクロが使えないからプレースホルダっぽい文字列になっているのかと思っていたら、 テストの時にはグローバルマクロも含めてマクロが展開されないだけで、 通常の通知の時には使えました。 マクロにしておけばメディアタイプのエクスポートで意図せずトークンが漏洩する可能性も減らせそうです。