Zabbixの通知を追加投資なしでLINE WORKSに飛ばす方法


0-0.まずはじめに

ネットに転がってる情報だけで、ロクに勉強もせずに切り貼りしただけなので改善ポイントは多数あります。
直せる人は直して使うヨロシ。

0-1.なぜこうなった

  • Zabbix 4.2.1を導入したが通知がメールだと見ない。
  • せっかくLINE WORKS使ってるんで、そっちに通知飛ばしたい。
  • 社内システムの監視だけなのに追加投資なんてできぬ。

ちなみにLINEならLINE Notifyという仕組みを使って通知できます。(手順は下記)
Zabbix から「LINE Notify」にアラート通知する方法

でも個人のLINEに会社のサーバの障害通知とかヤダァってことで。

0-2.前提条件

  • LINE WORKSを導入していること(フリー版可)
  • ZabbixをLinux(CentOS7.x)にインストールできる、またはしていること
  • グローバルIPが固定(≠DynamicDNS)であること(LINE WORKSのbotで使用します)

一番ハードル高いのは固定IPですね。
もし固定IPが取れないなら「追加投資なしで」というのは難しいかも。
Herokuの無料プランとか使って作ってみるのもアリかもしれませぬ。
そんなときは下記参照。
LINE WORKSで初めてのBot開発!(前編)
LINE WORKSで初めてのBot開発!(後編)

0-3.手順

  1. まずZabbixを導入します。
  2. 次にLINE WORKSのbotを作ります。
  3. Zabbixの通知をちょこっとカスタムします。
  4. シェルスクリプトを書きます。
  5. ZabbixでLINE WORKSへ通知するためのメディアタイプを作ります。
  6. 夜中の障害通知に起こされてキレます。
  7. Zabbixで特定のアラートを通知しないように設定します。(安眠のため)

1.Zabbix 4.2.1を導入しよう!

Zabbix 3.0をCentOS 7にインストール
この記事はZabbix3.0ですが手順は同じ。
詳細は割愛!!!

2.LINE WORKSでAPIを使う準備をしよう!

ローカルでLINE WORKSのトークBotを実装してみた
ここ参照。
APIの利用設定だけでよいです。
コールバックとか不要!
通知するだけだから!!!
念の為:LINE WORKS Developer Console

3.Zabbixの通知をちょこっとカスタム

Zabbixの障害通知って、見づらいよねってことです。
1. Zabbixの「設定」>「アクション」>「Report problems to Zabbix administrators」を開いて「複製」をクリックします。
2. 適当な名前をつけます。

3. 「実行内容」をクリックして中身を変更します。(\nは改行ですね)
 LINE WORKSで横に長い文字列がダーっと来ると見づらくてたまらんので改行しまくります。
 デフォルトの件名   :【障害発生】\n{EVENT.NAME}\n
 デフォルトのメッセージ:【発生日時】\n{EVENT.DATE}\n{EVENT.TIME}\n\n【ホスト名】\n{HOST.NAME}\n\n【深刻度】\n{TRIGGER.SEVERITY}\n\n【障害番号】\n{EVENT.ID}
 ※ちなみに、本来はこのテキストエリアの中で改行したものがそのまま反映されますが、うまくいかなかったのでここで改行コードを入れてます。
 ※つまり、ここで改行しちゃダメです。

4. 「復旧時の実行内容」も同様に中身を変更します。
  ま、ほとんど同じですね。
 デフォルトの件名   :【障害回復】\n{EVENT.NAME}\n
 デフォルトのメッセージ:【回復日時】\n{EVENT.RECOVERY.DATE}\n{EVENT.RECOVERY.TIME}\n\n【ホスト名】\n{HOST.NAME}\n\n【深刻度】\n{TRIGGER.SEVERITY}\n\n【障害番号】\n{EVENT.ID}

5. ここまでいったら「更新」をクリック。
6. 画面には載せてませんがデフォルトの「Report problems to Zabbix administrators」は無効にしときましょう。

4.シェルスクリプトかく

めんどくさい!
JSONしねええええええ!!!!
ディレクトリはZabbixのアラートスクリプトのデフォルト(/usr/lib/zabbix/alertscripts/)です。
概要はZabbixが出してくる文字列をCURLコマンド(以下、カールおじさん)でLINE WORKSのbotに紐付いているアカウントに送るてことです。
BotNoとかAPI IDとかはLINE WORKSのDeveloperんとこで確認しといてください。

あと、なんかわかんないんですけど、今回「半角スペース入ってると送れない問題」と「ダブルクォーテーション入ってると送れない問題」が発生したので、シェルの中で置換するなり削除するなりしています。
無知なんで原因はわかりませんが、多分JSONの書き方の問題なのカナァと思ってます。

あとはとりあえずカールおじさんが頑張ってくれてるってことです。
一応念の為・・ターミナルでcurlと入力して「そんなのネーヨ」と言われた場合はyum install curlとかでインストールしてください。
yumに「何もしません」とか言われた際はリポジトリを追加してからyumしてください。

/usr/lib/zabbix/alertscripts/lw.sh
#!/bin/sh

# Bot番号
bot=<BotNo>

# LINE WORKS Account
lwacc=$3

# ダブルクォーテーション削除
b1a=`echo $1 | tr -d '"'`
b2a=`echo $2 | tr -d '"'`

# 半角スペース置換
b1=`echo $b1a | tr " " "_"`
b2=`echo $b2a | tr " " "_"`

# 通知内容
body=$b1'\n'$b2


curl -v -H "Accept: application/json" \
 -H "Content-Type: application/json; charset=UTF-8" \
 -H "consumerKey: <Server API Consumer Key>" \
 -H "authorization: Bearer <Server List(固定IPタイプ)のToken>" \
 -X POST -d '{"botNo":'$bot',"accountId": "'$lwacc'","content":{"type":"text","text":"'$body'"}}' \
 https://apis.worksmobile.com/<API ID>/message/sendMessage/v2


exit 0

素人感満載ですがこれで動くんで!!!!
各所に挿入してる<API ID>とか<Server API Consumer Key>とかは変数に入れてもよいやつだと思います。
自分の場合は変更しないんでこれでいいやって感じです。
社内のだし。

5.Zabbixでメディアタイプつくる

  1. Zabbixの「管理」>「メディアタイプ」>「メディアタイプの作成」をクリック

  2. 適当に作ります。
    名前は適当で、タイプは「スクリプト」、スクリプト名はさっき作ったシェルスクリプトのファイル名を指定します。
    スクリプトパラメータは3つ使用します。
    1つ目はアラートのタイトル:{ALERT.SUBJECT}
    2つ目はアラートの本文:{ALERT.MESSAGE}
    3つ目はLINE WORKSのログインIDを入力してください。(モザイクのとこ)

  3. 更新をクリック

6.安眠妨害されます

Windows10系に入っているサービス「OneSyncSvc_****」(はランダムな英数字)とかいう自動起動サービスが時たま止まることにZabbixちゃんは敏感に反応してしまうので、W2K16以降のサーバ監視をしてる場合は要注意です。
他にも何かをトリガーにして動いたり止まったりするサービスに対してもZabbixちゃんは敏感なので、除外して構わないサービスについては除外する必要があります。

7.ZabbixでWindows系のサービスアラートを一部除外します

※大切です、とても。
1. 「管理」>「一般設定」の中の右上プルダウンから「正規表現」を選びます。

2. Windows service names for discoveryという項目をクリックします。

3. 色々除外設定されてるんですが、足りないんで追加します。
 デフォルト:^(MMCSS|gupdate|SysmonLog|clr_optimization_v2.0.50727_32|clr_optimization_v4.0.30319_32)$
 追加:^(OneSyncSvc.*)$
 ※我が社は除外したいものがたくさんあるので、4行になっちゃいましたてへぺろ

8.おまけ

テストでサーバを落とした結果・・

こんな風になります。
(スクショ間違えて回復報でした・・)

こんなんでわかりますでしょ!
おつかれしたァ。