Zabbix 3.2で障害時にSlack通知させる

各種調べていましたが、Zabbix 3.2での設定がなかなかまとまっていないので備忘録として書いておきます。

# 環境

Macですが、基本的に多少の修正でどのLinux系OSでもいけるはずです。

* Zabbix 3.2.1
* OS X 10.11.6 (EI Capitan)

# 設定の流れ
* slack通知用のスクリプトのダウンロードと設定
* メディア設定
* ユーザ設定
* アクション設定
* アラートテスト

# slack通知用のスクリプトのダウンロードと設定

主に、[zabbix-slack](https://github.com/bageljp/zabbix-slack)を使います。
github上にはグラフが見れるようになってますが、スクリプトのままだとサーバ側をごにょごにょ設定しなければいけないので、今回はグラフ表示対応はしていないです。

Zabbixのalertscriptsフォルダにいきslackのスクリプトを設置します。

```
cd /usr/local/share/zabbix/alertscripts
wget https://raw.githubusercontent.com/bageljp/zabbix-slack/master/slack.sh
chmod a+x slack.sh
```

slack.shを以下のように変えます。なお、slack_urlは[Incoming Webhooks](https://api.slack.com/incoming-webhooks)らへんを見ながら自身のを取得して設定してください。zabbix_username, zabbix_passwordもデフォルトのままですが、本番状況に応じてかえてください。

```diff
14,16c14,16
< zabbix_baseurl="http://localhost:8001"
< zabbix_username="admin"
< zabbix_password="zabbix"
---
> zabbix_baseurl="http://zabbix.example.com"
> zabbix_username="yourzabbixusername"
> zabbix_password="zabbixpassword"
42c42
<     ${cmd_wget} --load-cookies="${chart_cookie}_${timestamp}"  -O "${chart_basedir}/graph-${item_id}-${timestamp}.png" -q "${zabbix_baseurl}/chart.php?&itemids[]=${item_id}&width=${chart_width}&period=${chart_period}"
---
>     ${cmd_wget} --load-cookies="${chart_cookie}_${timestamp}"  -O "${chart_basedir}/graph-${item_id}-${timestamp}.png" -q "${zabbix_baseurl}/chart.php?&itemids=${item_id}&width=${chart_width}&period=${chart_period}"
48c48
<         trigger_url="${zabbix_baseurl}/history.php?action=showgraph&itemids[]=${item_id}"
---
>         trigger_url="${zabbix_baseurl}/history.php?action=showgraph&itemids=${item_id}"
```

**注意: zabbix自体が外部からアクセスできない場合などは、グラフ画像を取得している部分でブロックして、スクリプトが実行終了しないので、該当部分はコメントアウトしておきます**

# メディア設定

[管理]->[メディアタイプ]からメディアを登録します。

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/3f12ac2f-ec07-c26b-697c-9cb366e800c9.png)

以下のようなパラメータで設定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/5d736076-27d1-b074-5187-ab49a5deecd3.png)

# ユーザ設定

通知したいユーザのメディアにSlackを登録します。追加を押すと登録できるので、以下のように登録します。
なおチャネルは#bot_testとしていますが、適当な部屋名としてください。

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/8303105c-50df-6865-313f-016fbc09dec2.png)

ステータスが有効になっている事を確認し、無効ならクリックして有効にする

# アクション設定

アクションを設定します。アクションとは、トリガーなどの条件が満たされたときにとられる行動です。
以下のように設定しています。
なお、追加しても、更新を押すまで登録されていないので気をつけてください。

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/1d001653-b2f2-266c-75d9-486bf49caf56.png)


---

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/429aa746-fce5-601a-a46d-4feb4a93ddfd.png)

```Report problem to slack```

---
![image](https://qiita-image-store.s3.amazonaws.com/0/30079/9da9849b-d699-4481-46ee-4e40bc67879a.png)

```** PROBLEM alert - {HOST.NAME}: {TRIGGER.NAME}```

---
![image](https://qiita-image-store.s3.amazonaws.com/0/30079/3ebc154e-27f2-ec46-e078-177401d5ff1a.png)

```** RECOVERY alert - {HOST.NAME}: {TRIGGER.NAME}```

メッセージは以下です

```
HOST: {HOST.NAME}
TRIGGER_NAME: {TRIGGER.NAME}
TRIGGER_STATUS: {TRIGGER.STATUS}
TRIGGER_SEVERITY: {TRIGGER.SEVERITY}
DATETIME: {DATE} / {TIME}
ITEM_ID: {ITEM.ID1}
ITEM_NAME: {ITEM.NAME1}
ITEM_KEY: {ITEM.KEY1}
ITEM_VALUE: {ITEM.VALUE1}
EVENT_ID: {EVENT.ID}
TRIGGER_URL: {TRIGGER.URL}
```

# アラートテスト

アラートを設定し終わったら実際にアラートがとぶかテストしてみます。
今回はかんたんに、CPUのロードが一定値を超えたらアラートが飛ぶように設定してあるしきい値を下げてから、負荷をかけ、確認してみます。

以下のところでしきい値を設定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/324653bb-987d-c22e-a193-793eed02f803.png)

その後、以下のコマンドをうって、負荷をあげます。コアが8個だったので2回実行しました。

```
$ yes > /dev/null & yes > /dev/null & yes > /dev/null & yes > /dev/null &
$ yes > /dev/null & yes > /dev/null & yes > /dev/null & yes > /dev/null &
```

アラートがslackに飛んだらkillします。

```
killall yes
```

以下のように正しく通知がとびました。

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/08487038-173f-e7a5-5373-6f2d4f229e19.png)

# アラートの送信ログの確認

以下のように[レポート]=>[アクションログ]で確認できます。

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/d64d4695-3c8e-118b-e9a9-dbd77e9b116d.png)

# 番外編: プロジェクトごとに異なるSlackチャネルへと通知する

ざっくり以下の手順を取ります

1. ホストグループを作り、通知させたいホストを登録する
2. ユーザグループを作り、上記のホストグループの読み込み権限を与える
3. ユーザを作り、メディアとしてSalckを登録。さらｊに上記のユーザグループに登録する
4. アクションを登録し、メッセージを送るようにする。その際に、実行条件として、ホストグループを1で作ったものにして、深刻度とAND条件で作成する


# 参考
* http://qiita.com/bageljp@github/items/20be937ca3bb92100e8f
* http://qiita.com/takashyx/items/3c9becf345cd58ca69bf
* http://qiita.com/tdkaoru/items/7ad9e28cf592f10849df