
Docker-ComposeでZabbix監視環境を構築し、死活監視を簡単に設定する(カスタムアラート設定)
はじめに
皆さん、こんにちは。 株式会社SHIFT サービス&テクノロジー本部 ITソリューション部 アプリケーションサービスGの平野です。
老朽化したシステムのマイグレーション支援業務を行っています。
前回まででZabbbixの起動と、ICMP監視の設定内容について記載しました。
今回で本シリーズは完了です。
Zabbixの設定でアラーム発報時に、カスタムスクリプトを実行する方法を記載していこうと思います。

1.通知スクリプトについて
Lineへの通知はLineNotifyを使用します。
LineNotifyについての詳細はこちら をご確認ください。
利用にはあらかじめトークンの発行が必要です。
今回は以下のようなスクリプトを用意しました。
ファイル名はLineNofty.shです。
<トークン>部分には、LineNotifyから発行されたトークンを設定してください。
curl -X POST -H "Authorization: Bearer <トークン>" -d 'message=test' https://notify-api.line.me/api/notify
今回は簡単なスクリプトを用意しました。
LineNotifyのエンドポイントをオプションを指定して呼び出すだけです。
'message=test' 部分は送信されるメッセージになります。
つまり今回は障害発生時にtestという通知が来るようにします。
他にもオプションでスタンプの送信なども可能です。
2.通知スクリプト配置
通知スクリプトを配置します。
デフォルト設定から変更していない場合、以下のディレクトリにアラートスクリプトを配置します。
/usr/lib/zabbix/alertscripts/
今回はDockerでZabbixを起動していますので、少しPathが異なります。
dockerーcompose.yamlで設定ファイルの場所を確認します。
doker-compose.yamlでファイルを開き、Zabbixサーバの設定を見てみると以下のようになっています。
/volumes:
\- /etc/localtime:/etc/localtime:ro
\- ./zbx_env/usr/lib/zabbix/alertscripts:/usr/lib/zabbix/alertscripts:ro
アラートスクリプトの配置ディレクトリは、コンテナを起動したディレクトリの、zbx_env配下に存在しそうです。
dockerーcompose.yamlが存在する以下のディレクトリの配下に、LineNofty.shをコピーします。
<dockerーcompose.yamlが存在するディレクトリ>/zbx_env/usr/lib/zabbix/alertscripts
3.Zabbix設定
コピーが終わったら、Zabbix側の設定を行っていきます。
3.1.メディアタイプの追加
まずはメディアタイプの追加です。
ZabbixのメニューからMedia Typesをクリックします。

メディアタイプの画面が表示されたら、Create media typeをクリックします。

メディアタイプの追加画面が表示されるので設定をしていきます。
TypeとScript name以外は何を設定しても大丈夫です。
今回は以下のように設定しました。
Name:LINENotify
Type:Script
Script name:LineNotify.sh ※2.で配置したファイルの名称
Description:LINE通知
記載したら「Add」をクリックします。

LINENotifyが追加されました。 Testをクリックしてテストしてみます。


エラーになりました。 パーミッションがないようなので、パーミッションをつけていきます。
エラーメッセージに記載されているスクリプトのパスは、
コンテナが認識しているパスなので、設定しているOSのパスとは異なります。

先ほどスクリプトを配置した以下のディレクトリに移動します。
<CurrentDirectory>/zbx_env/usr/lib/zabbix/alertscripts
以下のコマンドでパーミッションをつけます。
sudo chmod +x LineNotify.sh
パーミッションをつけたら再度「Test」をクリックしてみます
今度は、curlがないというエラーです。。
Dockerイメージ内にcurlがないようなので、コンテナのコンソールに入って設定が必要なようです。

以下のコマンドでDockerのプロセスを確認します
sudo docker-compose ps

コンテナが3つ起動していますが、zabbix-docker-64_zabbix-server_1がzabbixのサーバです。
以下のコマンドで、Zabbixサーバに入ります。
-uオプションでrootを指定してrootユーザーでコンソールを使用します。
sudo docker container exec -u root -it zabbix-docker-64_zabbix-server_1 bash
ログインできた後は、aptを使用してcurlをインストールするだけです。
apt-get install curl
Reading package lists... Done
Building dependency tree... Done
4.deb ...
Unpacking curl (7.81.0-1ubuntu1.15) ...
Setting up libcurl4:amd64 (7.81.0-1ubuntu1.15) ...
Setting up curl (7.81.0-1ubuntu1.15) ...
Processing triggers for libc-bin (2.35-0ubuntu3.1) …
成功しました
インストールに成功したようなので、もう一度テストしてみます。

成功しました。
通知もちゃんと来ています。
[障害通知]となっているのは、トークン発行時に通知名に、 障害通知という名前をつけたからです。

メディアタイプの設計が終わりました。
3.2.ユーザーへのメディアタイプの割り当て
メディアタイプを作成したら、次はユーザーが使用するメディアとして、メディアタイプを割り当てていきます。
今回はAdminユーザに通知を送信する想定で設定します。
ZabbixのメニューからUsersをクリックします。

以下の画面が表示されたら、Adminをクリックします。

Mediaタブを選択し、Addをクリックします。

以下の画面が表示されるので設定していきます。 入力が終わったら、Addをクリックします。
Type:LINENotify
Send to:なんでも構いません。今回はAdminにしています。
Where active:デフォルトのまま変更しません。月-金曜日 0-24時を指定します。
User if severity:今回はHighのみで良いと思いますが、全ての通知レベルにチェックを入れてます。

Mediaが追加されました。

3.3アクションの追加
アラート発生時のアクションを設定していきます。
今回はあらかじめ設定しているトリガーで、カスタムスクリプトを実行する為、
Actions→Trigger Actionsを選択します。

以下の画面が表示されたら、Create actionをクリックします。

ActionタグのNameとConditionsを設定します。
Nameはわかりやすい名称であればなんでも良いです。今回はLine通知にしてみました。

Nameを入力したら、Conditionsの設定をしていきます。
ConditionsのAddをクリックします。
Hostに設定したPing監視のイベントが発生した際に実行するアクションを設定するので、以下のように設定し、selectをクリックします。
Type:Trigger
Operator:equals
Trigger source:Host

Hostグループの選択画面が表示されるので、今回監視するSIP-GWが所属しているnetwork devicesを選択します。

今回はSIP-GWして登録していないので、一つしか表示されませんが、所属するHostの一覧が出てきます。
SIP-GWを選択します。

SIP-GWに設定されている監視トリガが表示されます。
High ICMP ping lossとUnavailable by ICMP pingにチェックを入れSelectをクリックします。

Conditionsの設定画面に戻ります。Triggerが追加されていることを確認し、Addをクリックします。

Triggerが追加されています。
今回はどちらかが発生した場合に通知が欲しいので、Type of conditionはOrを選択します。

次に、Operationの設定をしていきます。
Action設定画面のOperationsをクリックします。
以下の画面が表示されたら、Addをクリックします。

実行の詳細について設定していきます。
最初にTriggerが発生した際に、 通知する対象のユーザーグループを設定していきます。
Send to user groupsのselectをクリックします。

3.2.ユーザーへのメディアタイプの割り当て でメディアタイプを割り当てた、Adminユーザーは、Zabbix administratorsグループに所属しているため、Zabbix administratorsにチェックを入れてSelectをクリックします。

実行の詳細設定画面に戻ります。
Send only toにLINENotiftyを指定します。
Addをクリックします。
デフォルトで値が入っている個所だけ説明します。
Stepsはトリガー発生後何度通知するかの設定です。
今回は1度だけ設定が来るようにしました。※0は無限に通知が来るので気を付けてください。
Step durationは通知の間隔です。
1分毎であれば、1mというような形で設定しますが、今回は1度だけなので0にしています。

実行の設定画面に戻るのでAddをクリックします。

これで設定完了です。
PINGの死活監視でエラーとなった場合に、LINEに通知が来るはずです。
LANケーブルを抜いて、通知が来るか試してみます。

Zabbixではアラートが上がっていますが、LINEの通知が来ません。 何か設定が足りないのか?

アクションログでエラーが出ていないか確認してみます。
メニューからReports→Action logを選択します。

No message defined for media typeと出ています。
MediaTypeにメッセージが定義されてない?

MediaType設定を見てみます。
message templatesタブにそれっぽいものがあります。
Addをクリックして、Message typeの設定を見てみます。

どうやらメール送信等を行う場合に、本文に設定する本文のtemplateのようです。
今回はLINEに固定文言を送るだけなので不要ですが、通知が来ないので設定してみます。
何を設定しても良いので、プルダウンからProblemを選択して、Addをクリックします。

設定できたので、もう一度LANケーブルを抜いて試してみます。
ちゃんと通知が来ました。
これで設定完了です。


今回のまとめ
これでZabbixで死活監視を設定し、SIP-GWに障害が発生した際に、LINEに通知が来るようになりました。
本記事を参考にすれば、監視設定から通知が来るまでを一通り試せると思います。
今回はLineNotifyを使用したためカスタムスクリプトになりましたが、メールでの通知やTwitterへの投稿は、Zabbixのtemplateの入っていたりするので、実はもっと簡単に設定できます。
本記事を参考に設定してみてはいかがでしょうか?
執筆者プロフィール:平野 史朗
前職の職場にはLSIの論理設計技術者として入社はずが、 修行のために転属したハードウェア開発部門でIP-PBX開発中に所属部署がなくなり。。 ソフトウェア開発会社に転籍。 客先でソフトウェア開発支援、テスト支援、等様々な業務を担当後SHIFT入社。 今後も今までの経験を生かして、お客様の課題解決に貢献していきたいと思っています。
お問合せはお気軽に
https://service.shiftinc.jp/contact/
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/
PHOTO:UnsplashのTaylor Vick