Zabbixでアラートが発生したときにPigeonで電話がかかるように設定する

Pigeonは複数人のチームに対して、誰かから応答があるまで電話連絡を順番に行うサービスです。
想定される主な使い方として、サービスを監視しているツールでアラートを検知したとき、このアラートをトリガーにPigeonを呼び出して、担当者に電話連絡をし、迅速に障害対応を行えるようにする、というものがあります。

ここでは、代表的な監視ツールの1つであるZabbixを例にとって、アラートを検知した際にPigeonで電話がかかるように設定する方法をご紹介します。

環境

  • Ubuntu 18.04
    • ZabbixがインストールされているOS
  • Zabbix 4.0

今回の検証では、Zabbixの最新のLTSである Zabbix 4.0 を使用しています。
お使いのバージョンにより、設定方法が微妙に異なる箇所がありますので、ご注意ください。

Pigeonの設定

まず、Pigeonでコールフローとガイダンスを作成します。
Pigeonの設定方法については、Pigeon チュートリアル 記事で詳しく記載していますので、そちらをご覧ください。

ガイダンスのメッセージには、以下のようなテキストを設定しておきます。

Zabbixでアラートが発生しました。
アラート発生ホスト、{{host}}。 アラート内容、{{message}}。
 対応される場合は1を、次の担当者に連絡する場合は2を、連絡から離脱する場合は3を、押してください。

設定ができたら、コールフローIDとガイダンスIDを保存しておいてください。
コールフローIDとガイダンスIDは、それぞれKompira cloudの以下の画面で確認することができます。

f:id:kompiracloud:20190613154954p:plain
コールフローID
f:id:kompiracloud:20190613155012p:plain
ガイダンスID

スクリプトの配置

PigeonでAPIから電話をかけるには、 [POST] /api/tasks を使用します。
以下のスクリプト pigeon_call.sh は、必要なパラメータを設定した上でこのAPIを呼び出すものです。
これを /usr/lib/zabbix/alertscripts/pigeon_call.sh として、Zabbixホスト上に保存しましょう。

#!/bin/bash
# Usage: pigeon_call.sh [call_parameters]

# Kompira cloud Space URL
SPACE_URL=https://yourspacename.cloud.kompira.jp

# Kompira cloud API Token
API_TOKEN=wJu1jij8GeccVVkTOzy8xWH5N2ugKWDWM+HcaV0J

# Pigeon / Callflow ID
CALLFLOW_ID=85f0a373-8b54-4c70-85a6-71957ecf7f48

# Pigeon / Guidance ID
GUIDANCE_ID=e689a0ea-8678-4c68-b832-8b3f8e402398

if [ -n "$1" ]; then
  CALL_PARAMETERS="$1"
else
  CALL_PARAMETERS={}
fi

TASK_URL=${SPACE_URL}/api/tasks
PAYLOAD="{
  \"namespace\": \"pigeon\",
  \"method\": \"chain\",
  \"params\": {
    \"callflowId\": \"${CALLFLOW_ID}\",
    \"guidanceId\": \"${GUIDANCE_ID}\",
    \"parameters\": ${CALL_PARAMETERS}
  }
}"

curl -s -X POST -H "accept: application/json" -H "X-Api-Version: 1.0" -H "X-Authorization: Token ${API_TOKEN}" "${TASK_URL}" -d "${PAYLOAD}"

このスクリプトのうち、以下の値はお使いの環境にあわせて編集してください。

  • SPACE_URL
  • API_TOKEN
  • CALLFLOW_ID
  • GUIDANCE_ID

Zabbixの設定

ZabbixのConfigurations -> Actions -> Create Actionと選択することで、新しいActionを作成することができます。
このActionで、Zabbixがある条件を満たしたときに pigeon_call.sh が実行されるように設定します。

f:id:kompiracloud:20190613171808p:plain
ActionでOperationを設定
f:id:kompiracloud:20190613172100p:plain
Opreationの内容を設定

Operationの設定では各項目を以下のようにします。

項目 設定内容
Operation type Remote command
Target list Current host
Type Custom script
Execute on Zabbix server
Commands /usr/lib/zabbix/alertscripts/pigeon_call.sh '{"host": "{HOST.NAME1}", "message": "{ITEM.NAME1}"}'

ここでは、実行するコマンドとしてホスト名 {HOST.NAME1} とトリガーのアイテム名 {ITEM.NAME1} を指定しています。
その他にもここでは様々なマクロを設定することができます。
今回はZabbix 4.0を検証に使用していますが、バージョンごとに指定できるマクロの種類・指定の名前が異なります。 詳しくは公式ドキュメントを参照してください。

www.zabbix.com

架電テスト

ここまでで、Zabbixで条件が満たされるとPigeonに通知が飛ぶように設定することができました。
この状態でActionの条件を満たすと、Zabbix上では先ほど設定した pigeon_call.sh を実行され、Pigeonで登録した電話番号に電話がかかってきます。

f:id:kompiracloud:20190613180004p:plain

上記の画面でもわかる通り、Status = Executed となっており、スクリプトが実行されていることがわかります。
また、Pigeonでは架電履歴を以下のように確認することができます。

f:id:kompiracloud:20190613180530p:plain
Pigeonで確認できる架電履歴

一番下の「指定パラメータ」では、API実行時に指定したパラメータを確認することができます。
今回の設定では、Action実行時のコマンドに hostmessage を渡しているので上記のようになっていますが、設定すれば他にも任意のkey, valueを渡すことができます。

まとめ

ここまで見てきたように、Pigeonを利用することで、障害発生時の自動電話連絡を簡単に設定することができます。
現在はサービス運用でメール通知しかしていないけれど、電話通知がしたい。でも電話通知をするのは結構大変そう・・・と考えている方は、ぜひ導入を検討してみてください。