Bash シェルスクリプト+ cURL+ Python3 標準モジュールで作る Webex bot 用 Zabbix Alert Script

この記事はシスコの有志による Webex Advent Calendar 2021 の 5 日目として投稿しています。
Webex Advent Calendar 2021: https://qiita.com/advent-calendar/2021/webex

# はじめに
今回は Bash シェルスクリプト、cURL および Python3 の標準モジュールで、Webex bot 用 Zabbix Alert Script を作ってみたので紹介します。Bash シェルスクリプト+cURL または Python3、どちらかだけでも実現できそうですが、下記の理由から組み合わせることにしました。

* Bash スクリプト+cURL だけで作成した場合、Webex bot に投げる body の JSON 作成が大変（Python の方が文字列処理が楽）
* Python だけの場合、Webex bot に POST するために requests モジュールなど非標準モジュールが必要になる（Zabbix サーバに追加のインストールをしたくない）

上記の理由から、おそらく Zabbix サーバに手を加えなくて済むであろう Bash シェルスクリプト+cURL+Python3 標準モジュールで作ることにしました。環境によってはこの組み合わせも標準ではないかもしれませんが、あくまでも筆者の Zabbix 環境ということでご容赦ください。

# 動作確認環境

* Zabbix 5.2.7
* CentOS 8.4
* Python 3.8.10

# 免責事項

スクリプトの実行は自己責任でお願いします。本スクリプトを実行することにより生じるいかなる問題に関しましても、筆者は一切責任を負いません。

# 準備
Webex bot に通知させるため、最低限下記の情報が必要です。

1. Webex bot の Access Token
1. 通知する部屋の roomid

Webex bot 生成と Access Token の取得は、下記サイトの『1.「Webex for Developers」で bot を作成する』に詳しい説明がありますので、そちらをご参照ください。
https://gblogs.cisco.com/jp/2021/08/make-meeting-reservation-system-by-webex-api-3/

roomid の取得は、bot 作成後その bot を含めた room を作成し、下記から取得可能です。
https://developer.webex.com/docs/api/v1/rooms/list-rooms

# スクリプトの説明
ここでは、実際に使う下記 2 つのスクリプトについて説明します。

1. zabbix-alerts.sh
1. convert.py

## zabbix-alerts.sh
これがメインのスクリプトになります。

```bash
#!/bin/bash

# 下記 Python スクリプトで body.json を作成
/usr/bin/python3 /lib/zabbix/alertscripts/convert.py "$1" "$2" "$3"

# send meesage to WebEx API
curl https://webexapis.com/v1/messages \
-x http://192.168.1.1:8080 \  # proxy がある場合
-H "Authorization: Bearer [Webex bot の Access Token を記述]" \
-H "Content-Type: application/json" \
-X POST \
-T /lib/zabbix/alertscripts/body.json
```

基本は cURL で Webex API にメッセージを投稿するだけのシンプルなシェルスクリプトです。しかし、Webex bot に複数行のメッセージを投稿する場合、markdown にして改行を変換する必要があります。そうした細かい body.json の作成を Python に行わせています。

## convert.py
こちらは、Bash シェルスクリプトから呼び出される Python スクリプトです。引数として渡された Zabbix からの文字列に対して、改行コードの変換およびタイトル付けなどを行っています。

```python
#!/bin/env python3

import sys

args=sys.argv

f=open('/lib/zabbix/alertscripts/body.json','w')
f.write('{"roomId": "[room id を記述]", "markdown": "To:')
f.write(args[1].replace('\r\n','\\n'))
f.write('\\nSubject:')
f.write(args[2].replace('\r\n','\\n'))
f.write('\\n')
f.write(args[3].replace('\r\n','\\n'))
f.write('"}')
f.close()
```

標準ライブラリである sys しか使っていないため、Python3 が動く環境であれば PIP などによる追加モジュールなしで動作可能です。

実際に生成される body.json は下記のようになります。cURL で送るため、改行のない文字列になっています。

```
{"roomId": "[room id を記述]", "markdown": "To:Admin\nSubject:Resolved in 1m 0s: Unavailable by ICMP ping\nProblem has been resolved at 11:29:11 on 2021.10.07\nProblem name: Unavailable by ICMP ping\nProblem duration: 1m 0s\nHost: R5-xrv5\nSeverity: High\nOriginal problem ID: 1082\n"}
```

## スクリプトの配置
上記のスクリプトを、root 権限で /lib/zabbix/alertscripts に配置します。実行属性をつけることを忘れないようにします。

```shell
[root@zabbix alertscripts]# pwd
/lib/zabbix/alertscripts
[root@zabbix alertscripts]# ls
convert.py  zabbix-alerts.sh
[root@zabbix alertscripts]#
```


## Zabbix への登録
最後に Zabbix への登録をして完成です。下記のように設定してみます。

![Screen Shot 2021-10-06 at 22.17.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/90c2d64c-c1da-a344-dc92-62e171959af2.png)



# 動作確認
実際にアラートが発生すると、Webex bot が下記のように通知してくれます。

![Screen Shot 2021-12-02 at 21.12.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/3c96f416-fa4e-f1da-b277-d2211007e423.png)


# 最後に
これで、何かあった際に Webex bot が通知してくれるようになりました。実際この連携を行ってから、機器の高負荷やディスク容量の不足など、Zabbix のダッシュボードを見に行かなくても知ることができてとても便利になりました。
皆様、楽しい年末年始をお過ごしください。