Zabbixの通知をLINEに送る

背景

ちょっと前にLINE NotifyというLINEのサービスが話題になりました。 developers.linecorp.com

これを使うと非常に簡単にシステムからLINEにメッセージを送れるのですが、Zabbixのような監視サーバのアラートをLINEに送るっていう使い方は結構需要があるのではないかと思い、LINE Notifyを使ってZabbixのアラートを送るalertscriptを実装してみました。

前準備

最初にLINE Notifyの設定をする必要があります。
下記のページにアクセスし、LINEのIDでログインすると「トークンを発行する」ボタンがあります。
https://notify-bot.line.me/my/

トークンを取得し、どこかにメモしておいてください。

Zabbixの設定

詳しく知りたい方は公式ドキュメントを参照してください。 5 Custom alertscripts [Zabbix Documentation 3.0]

alertscriptの配置

トークンとメッセージのタイトル、メッセージの内容を引数に取るスクリプトを作成し、/usr/lib/zabbix/alertscriptsに配置します。
LINE Notifyとの通信にはcurlを使います。詳しくは以下のサイトを参照してください。

以下はスクリプトのサンプルです。
curlからのレスポンスをjqで読み取って終了ステータスをきちんと返すようにしましたが、Zabbixは終了ステータスを見てくれないみたいです。。

#!/bin/bash

token="$1"
subject="$2"
body="$3"

LINE_API_URI='https://notify-api.line.me/api/notify'
LOG_FILE=${0%.*}.log

function write-log() {
  echo "$(date '+%Y/%m/%d %H:%M:%S') $1" | tee -a ${LOG_FILE}
}

write-log "token=${token}"
write-log "subject=${subject}"
write-log "body=${body}"

if [ -n "${subject}" ] && [ -n "${body}" ]; then
  message=\
"${subject}

${body}"
elif [ -n "${subject}" ] || [ -n "${body}" ]; then
  message="${subject}${body}"
else
  exit 1
fi

cmd="curl -X POST -H 'Authorization: Bearer ${token}' -F 'message=${message}' ${LINE_API_URI}"
write-log "executing: ${cmd}"

response=$(eval "${cmd}" | jq -Mc ". +  {"exit_code": $?}")
write-log "response: ${response}"

exit_code=$(echo "${response}" | jq -Mc '.exit_code')
response_status=$(echo "${response}" | jq -Mc '.status')
response_message=$(echo "${response}" | jq -Mc '.message')

if [ ${exit_code} -gt 0 ]; then
  exit ${exit_code}
fi

if [ ${response_status} -ne 200 ]; then
  echo "status : ${response_status}"
  echo "message: ${response_message}"
  exit 1
fi

exit 0

メディアタイプにカスタムスクリプトを登録

  1. Zabbixにブラウザでアクセスし、[管理] - [メディアタイプ] を開き、[メディアタイプの作成]をクリックします。
  2. 以下のように項目を入力し、[追加]ボタンを押します。
項目 入力値 説明
名前 LINE Notify メディアタイプの名前
タイプ スクリプト
スクリプト line_notify.sh alertscriptフォルダ配下のスクリプトのファイル名
スクリプトパラメータ {ALERT.SENDTO} 第一引数。ユーザ設定で送信先に指定した値が入る。
{ALERT.SUBJECT} 第二引数。メッセージのタイトル。
{ALERT.MESSAGE} 第三引数。メッセージの内容。

ユーザーの設定

  1. Zabbixで[管理] - [ユーザー]を開き、LINE Notifyで通知を送りたいユーザーの設定画面を開きます。
  2. [メディア]タブを開き、[追加]をクリックします。
  3. [タイプ]に新しく追加したメディアタイプの名前を指定します。
    [送信先]にLINE Notifyのトークンを指定します。 その他の項目は適宜設定してください。
  4. 更新ボタンをクリックします。

後はアクション等の設定が入っていれば、これでLINEに通知が行くようになっているはずです。

まとめ

ZabbixのアラートをLINEに飛ばす方法でした。
私が以前勤めていた会社では携帯にメールで飛ばす感じだったんですが、今の世の中だとLINEに送ったほうがやりやすい職場も多いのではないかと思います。そのうちLINE Business Centerを使ったやり方も試してみたいです。