Zabbixのアラートメールにグラフ画像を添付する

Zabbixでアラートメールを受信した後、Zabbix Webで該当項目のグラフを参照したりしますよね？
Zabbix Webは外出先からでは直接アクセスできない環境にあることも多いと思います。
そこでアラートメールだけで直近のデータ遷移が確認できるように
該当アイテムのグラフ画像を、メールに添付するアラートスクリプトを作りました。

zabbix 2.5.0 (3.0 alpha版) でも動作することを確認しました。

#スクリプトの設定
##Zabbixサーバに alertscriptの設置

```
$ cd /etc/zabbix/alertscripts
$ wget https://raw.githubusercontent.com/ma3ki/sendimgmail/master/sendimgmail.sh
$ wget https://raw.githubusercontent.com/ma3ki/sendimgmail/master/sendimgmail.conf
$ chmod 755 sendimgmail.sh
```

##sendimgmail.confの設定
※設定変更する必要がある項目のみ記述

|項目|初期値|説明|
|---|---|---|
|ZABBIX_URL|http://127.0.0.1/zabbix|Zabbix WebのURL|
|ZABBIX_USER|admin|Zabbix Webのログインユーザ|
|ZABBIX_PASS|zabbix|Zabbix Webのログインパスワード|
|BASIC_USER|-|ログインユーザ(BASIC認証必要時)|
|BASIC_PASS|-|ログインパスワード(BASIC認証必要時)|
|MODE|0|グラフ(0)かスクリーン(1)かを設定|
|IMAGE_TEMP|/var/tmp/imgtmp|テンポラリディレクトリ(zabbix権限で書き込める必要あり)|
|MAIL_FROM|hogehoge@example.com|アラートメールのFromアドレス|
|MAIL_NAME|zabbix_alert|アラートメールのディスプレイ表示名|
|SMTP_URL|smtp://127.0.0.1:25|アラートメールのSMTPサーバURL|
|PRITEXT|user.info|syslogのレベルとファシリティ|
|VERBOSE|1|ログレベルを詳細(1)か通常(0)かを選択|
|PROCESS_LIMIT|10|同時プロセス数制限値|
|CULROPTS|--silent --show-error|curlオプション|

設定を環境に合わせて変更

```
$ vi sendimgmail.conf
```

##添付ファイルの送信に使用する mutt コマンドをインストール

```
$ sudo yum install mutt
```

##テスト
デフォルトのZabbixサーバの監視設定がされていれば、下記コマンドでテストメールが送信できるはず。

```
$ sudo su - zabbix
$ cd /etc/zabbix/alert
$ ./sendimgmail.sh ma3ki@ma3ki.net "test_subject" "$(echo -e "host: Zabbix server\nkey: system.cpu.load[percpu,avg1]")"
```

※ma3ki@ma3ki.netを、実際の送信先に変更して実行する

#Zabbixへの設定
##メディアタイプの設定
sendimgmailを追加
![スクリーンショット 2014-12-10 1.03.01.png](https://qiita-image-store.s3.amazonaws.com/0/40672/68427e66-9ea3-1f71-9d05-a6b33a294fc4.png)

##ユーザのメディアの設定
sendimgmailの送信先を追加
![スクリーンショット 2014-12-10 1.05.36.png](https://qiita-image-store.s3.amazonaws.com/0/40672/90b486cd-8d77-f3b8-095d-c2f899ac2492.png)

##アクションの設定
アクション、実行条件、実行内容を追加
![スクリーンショット 2014-12-10 1.06.40.png](https://qiita-image-store.s3.amazonaws.com/0/40672/815eee99-deb9-436d-997b-195b25bb8db5.png)

``` :default-messages
[検知日時]　{EVENT.DATE} {EVENT.TIME}
[ホスト名]　{HOSTNAME}
[IPアドレス]　{IPADDRESS}

[アイテム名]　{ITEM.NAME}
[アイテムキー]　{TRIGGER.KEY}
[アイテム値]　{ITEM.VALUE}

[コメント]
{TRIGGER.COMMENT}

[グラフ情報]
host: {HOSTNAME}
key: {TRIGGER.KEY}
```

``` :recovery-messages
[検知日時]　{DATE} {TIME}
[ホスト名]　{HOSTNAME}
[IPアドレス]　{IPADDRESS}

[アイテム名]　{ITEM.NAME}
[アイテムキー]　{TRIGGER.KEY}
[アイテム値]　{ITEM.VALUE}

[グラフ情報]
host: {HOSTNAME}
key: {TRIGGER.KEY}
```

アクションの実行内容で上記で設定したメディアを使用する
host と key を元にグラフを探し、存在する場合のみ添付をします。
グラフが存在しない場合は、添付なしのメールが配送されます。
このスクリプトを使用してアラートメールを送信する場合、グラフがあろうがなかろうが host と key 項目は必要です。

#アラートメールの例
+ アラートメール
![IMG_1475.PNG](https://qiita-image-store.s3.amazonaws.com/0/40672/b9f55a32-d0c2-211d-bf61-621de05452eb.png)

+ リカバリーメール
![IMG_1476.PNG](https://qiita-image-store.s3.amazonaws.com/0/40672/f00bdf6b-0d17-eb43-80f0-42de2f6b908d.png)

#テスト環境
スクリプトは下記の環境でテストしています。
- CentOS 7.1
- Zabbix 2.4

#動作補足
1. プロセス上限に達した場合は、添付なしのメールを送信する
2. グラフが複数存在するアイテムは、複数グラフを添付する
3. スクリーンモードでスクリーンが見つからない時は、該当アイテムのグラフだけを添付する
4. １つのグラフが複数のスクリーンに設定されている時は、最初のスクリーンに登録されているグラフのみを添付する
5. グラフが複数存在するアイテムで、それぞれのグラフが別々のスクリーンに登録されている時は、それぞれのスクリーンに登録されているグラフを添付する
6. 20秒以内に更新された対象のグラフデータがテンポラリに存在する時は、更新をしない
7. スクリーンにグラフ以外のデータが登録されていた場合、そのデータは無視する
8. グラフデータの取得などに時間がかかり、30秒以内にメール送信処理まで終わらない場合は、落ちます。落としたくない方はZabbixからの実行時に & などを付けて実行するランチャースクリプトを挟んでください。