Zabbix 5.0 で Slack にアラートを連携する

Zabbix 5.0からはwebhook機能が充実したと聞いて、早速Slackに連携して遊んでみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/e8fae466-e48a-def3-ac22-380339d1e57b.png)


#1.Slack APIの設定
Slack APIを作成するため、Slack APIページにアクセスし、Slackアプリを作成します。

https://api.slack.com/

まずはトップページの[Create an app]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/4354311c-f32a-fa73-26be-fa3a8c7a7eb8.png)

続けて、[From scratch]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/a14ab886-e36d-bca7-d41a-30ab8244092e.png)

次に、`App Name`と`Pick a workspace to develop your app in:`を入力します。
`App Name`は任意のBot名、`Pick a workspace to develop your app in:`には通知先のワークスペースを入力します。
入力したら、[Create App]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/dd6195af-9c34-6ea5-488c-7ff9e814eca4.png)

こちらの画面が表示されたらBOT作成完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/52369cea-1e07-b67c-709e-b0982813b9a0.png)

同じ画面の[OAuth & Permission]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/6df99823-f34f-ec93-4558-9f814ef5208e.png)

中段の[Scopes] - [Add an OAuth Scope]を押下し、[calls:write]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/044f7953-43c4-1e09-0766-081db579fe6f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/e8fc614d-0eb9-f383-a6a4-ad5ec25aa3f5.png)

上部にSuccess!と表示されたら、上段の[OAuth Tokens for Your Workspace] - [Install Workspace]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/0c41d982-c9d9-54ee-587f-dfb3f1d06564.png)

アクセス許可の画面が表示されるので、[許可する]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/2db15e04-a3a6-d79f-acb8-79d1bd926116.png)

再びSlack APIの画面にて、アクセストークンが表示されるため、こちらのトークンを控えておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/caf7642e-a3a9-df62-1a7d-0433b0a6694e.png)

</br></br>

#2.Slackワークスペース、チャンネルの設定
次はSlackワークスペースを表示します。

[App]を展開し、先ほど作成したBOTが表示されることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/e1f6b584-d733-1ecd-8e74-7fe473404814.png)

続いて、通知用のチャンネルを作成します。
チャンネル名は`zabbix_notification`とでもしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/b9c84f57-dc88-0ca3-f7d0-8fe7508ac4e7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/ac74a661-3722-5c16-4a66-16c9098fda25.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/d6d726a5-26c5-15c4-75e6-4047dbde198e.png)

その後、チャンネルオプションからインテグレーションの設定をします。
チャンネルオプションを表示して、[インテグレーション]タブを表示します。
[App]-[アプリを追加する]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/6eba7c99-4b57-12e8-bf78-b69c03e8613b.png)

アプリ追加の画面で、最初に作成したBOT(Zabbix_Slack_Notification)を[追加]します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/3ccaa600-6c95-f6f1-ee67-f95be4aaa536.png)

追加が完了すると、Slack側の設定は完了です。

#3.Zabbixメディアタイプの設定
こちらからはZabbix Server側で設定を行います。

まずは[管理]-[メディアタイプ]を選択し、その中に[Slack]がありますので押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/d1f2c1d3-7c1a-f07d-07ca-a84ec11f1196.png)

まずはこのデフォルト設定を汚さないため、複製して別名で作成するため、下部の[複製]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/757f5fe8-5ab1-966d-8215-312ff5955e85.png)

複製したメディアタイプ設定について、以下の項目は記載を変更します。
設定を変更したら[追加]を押下します。

項目 | 設定 | 備考
--- | --- | ---
名前 | [メディアタイプ名] | 既存と重複はNG
bot_token | [Slack APIで表示されたトークン] | -
zabbix_url | http://[ZabbixServerのIPアドレス]/zabbix/ | -

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/5e4955f2-5f71-fded-4564-57f066784bad.png)

>なお、`zabbix_url`については`{$ZABBIX.URL}`のままにし、グローバルマクロを修正する方法もありますが、当環境では何故かうまく設定が反映されなかったため、直書きで記載をしています。

</br></br>

#4.メディアタイプのテスト
ここで、先ほど設定した内容にてZabbixからSlackへ連携できるかテストを行います。

テスト自体は、作成したメディアタイプの右にある[テスト]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/2d185554-c379-df66-455e-065942da8d5e.png)

テスト用の内容一覧が表示されるため、以下のみ手動で書き換えてから[テスト]を押下します。

項目 | 設定
--- | ---
channel | [Slackチャンネル名]
event_id | 1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/f1b770d8-c587-8b9d-39e8-1d41d3e9f787.png)

成功すると、Zabbix側では以下が表示され、Slack側でも通知がされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/76b22dee-f468-a1c8-c2c7-3c0df66fad0e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/0bf60d24-eba4-1633-b61a-62c755a468c5.png)

失敗するとZabbix側にアラート内容が記載されるので、適宜修正を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/3c75f586-8ad9-bfa4-a805-c0c3a9c21407.png)

>なお、初回テスト時に以下の内容も編集する必要がある場合があります。設定内容に`0`を入れると通知が飛ばないようでしたので、基本は`1`を設定します。
>
項目 | 設定
--- | ---
event_nseverity | 1
event_source | 1
event_tags | 1
event_update_status | 1
event_value | 1
trigger_id | 1

</br></br>

#5.通知ユーザの設定
通知するためにはZabbix側でユーザを作成する必要がありますので、ユーザを作成します。
なお、ユーザ権限周りについては必要最低限度に絞った方が良いですが、今回は最上級特権の`特権管理者`を割り振ります。

[管理]-[ユーザー]でユーザー画面を表示し、右上の[ユーザー作成]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/318ab671-3879-8e96-169e-8088339d71a4.png)

[ユーザー]タブでユーザー名、グループ名、パスワードを設定します。
グループ名は適当にデフォルトのものを設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/afea2f3c-e1ea-12f6-9d79-dc1235e91924.png)

続いて[メディア]タブでメディア欄の[追加]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/19a7aa67-2e21-7010-06b7-3fd24be42bc1.png)

[タイプ]は先ほど作成したメディアタイプ名を、[送信先]にはSlackのチャンネル名を入力して[更新]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/7854644d-6893-398f-ec18-2289bf0f9bd3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/b07f9eac-7247-fee2-9348-ec5a421c7879.png)

最後に、[権限]タブを表示し、[ユーザの種類]を特権管理者に設定して、[追加]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/4c15c86a-bc0a-6f61-2ced-1bd7a9a1ce55.png)

>[ユーザーの種類]で特権管理者以外を選択する場合、[ユーザー]タブで設定したユーザグループの権限を継承しますので、詳細に権限を割り与える場合はユーザーグループ側の権限を正しく付与する必要があります。

</br></br>

#6.アクションの設定
Zabbix側の設定としては最後となる、アクションの設定を行います。

[設定]-[アクション]から右上の[アクションの作成]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/6952896f-b9f6-d6a9-6137-43dc8d252374.png)

[アクション]タブにて、名前と実行条件を設定します。名前はなんでもよく、実行条件もなんでもよいですが、一般的な`メンテナンス期間外`と`警告以上を通知`を設定しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/c208f2f2-bd54-beee-e17b-30aa30e7a021.png)

続いて、[実行内容]タブから[実行内容]-[追加]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/8f633f75-8388-1d87-31b5-4c12d98930bb.png)

[実行内容の詳細]画面にて、[ユーザーに送信]に先ほど作成したユーザを、[次のメディアのみ使用]に作成したメディアタイプを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/ff1e7851-21fa-bb2d-790f-8c8967715b33.png)

また、[復旧時の実行内容]も同様に設定をしておきます。
＃復旧検知可能な監視アイテムについて、復旧時にもアラートが出るようになります。CPU使用率の閾値回復やプロセス停止後の起動検知など。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/62108f61-3b5f-38f6-662c-5dddb7394f1b.png)

実行内容、復旧時の実行内容の両方の設定完了後、[追加]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/54462b98-0446-5195-3448-2b0696e91e07.png)

アクションが追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/3d5075e7-7495-7a36-9492-513d29cab5d6.png)

これにて、Zabbix/Slack連携の設定は完了です。

</br></br>


#7.Slackへの障害通知連携
最後に、障害発生時のSlack連携内容について確認します。
今回はLinuxサーバのcrondプロセス監視を利用し、crondプロセスを停止することで疑似故障、開始することで疑似回復のアラートを発行します。

##7.1 crondプロセス停止
crondプロセスを停止します。

```text:crond_stop
[root@cent79-02 ~]# systemctl stop crond
[root@cent79-02 ~]# systemctl status crond
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since 月 2021-08-30 20:11:51 JST; 26s ago
《中略》
```

Zabbix側で障害が通知され、アクションが発行されたことが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/092df57c-59ed-2bfa-94b6-95cb71801cf3.png)

Slack側でも障害通知が確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/f7586d4b-bc81-68a3-fe82-244337662a95.png)

##7.2 crondプロセス開始
crondプロセスを開始します。

```text:crond_start
[root@cent79-02 ~]# systemctl start crond
[root@cent79-02 ~]# systemctl status crond
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since 月 2021-08-30 20:15:16 JST; 1s ago
《中略》
```

Zabbix側で障害が解決済になり、アクションが発行されたことが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/0897bbfb-0044-e845-60f8-665f2fe7ef7c.png)

Slack側でも回復通知が確認できました。
なお、先に通知された障害通知に対し、回復通知が上書きされているため、障害通知の内容自体は消えています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/cc331f72-2e28-ed84-6529-9a288e710704.png)

#参考
https://api.slack.com/

https://devlog.arksystems.co.jp/2021/07/27/13746/

https://qiita.com/migaras/items/bc0dde421af9650d109c

https://blog.n-z.jp/blog/2020-06-21-zabbix5-slack.html