RubyでZabbixアラートをSlackに通知する
環境
- CentOS7.6
- zabbix4.0
- Ruby2.4
設定方法
slackのWebhook URLを取得する
通知したいチャンネルのWebhook URLをまず取得します。
対象のワークスペースの対象チャンネルにIncoming Webhookインテグレーションを追加します。
表示されたWebhook URLをコピーし、スクリプト内でURLを指定します。
zabbixアラート用スクリプトを作成する
今回は、"zabbix_notify_to_slack.rb"というスクリプトを作成しました。
作成したスクリプトは、githubに置いています。
github.com
zabbixアラート通知用ディレクトリにスクリプトを移動する
zabbixでは、アラートがあがったときに対象のディレクトリにスクリプトを配置しておくと自動的に実行されるので、対象ディレクトリを調べて移動させます。
Zabbixアラート用ディレクトリは、以下のように設定ファイルに書かれているので確認します。
# zabbixアラート用ディレクトリパスを確認 $ sudo cat /etc/zabbix/zabbix_server.conf | grep alertscripts # AlertScriptsPath=${datadir}/zabbix/alertscripts AlertScriptsPath=/usr/lib/zabbix/alertscripts # 対象ディレクトリに移動 $ mv zabbix_notify_to_slack.rb /usr/lib/zabbix/alertscripts # 忘れずにスクリプトに実行権限をつける $ chmod +x /usr/lib/zabbix/alertscripts/zabbix_notify_to_slack.rb
zabbixで対象スクリプトが実行されるように設定する
Zabbixにログイン後、[Administration]>[Media Types]>[Create media type]をクリックし、以下のように、対象スクリプトとスクリプトのパラメータを設定します。
スクリプトパラメータに設定しているのは、Zabbixがサポートしているマクロです。今回は、{ALERT.SENDTO}、{ALERT.SUBJECT}、{ALERT.MESSAGE}の3つを使います。これらは、スクリプトを実行する際に使用するコマンドライン引数になります。
Zabbixのマクロ一覧は下記から確認することができます。
www.zabbix.com
続いて、[Administration]>[Users]>[Admin]をクリックし、メディアを追加します。[Add]をクリックします。
Typeに登録したメディアタイプを選択し、Send toにはSlackのチャンネル名、アラートを通知したい深刻度にチェックを入れます。今回は、深刻度が[Warning]以上のものをSlackに通知させたいと思います。
最後にアクションの設定をします。[Configuration]>[Actions]>[Create action]をクリックします。
[Operations]の[Operations]>[New]から
"Send to User"に先ほどメディアを追加したユーザーを選択し、今回はSlackにのみ通知したいので"Send only to"でslackのメディアを選択しました。
これで設定完了です!
意図的にZabbixアラートを発生させる
今回、ZabbixのトリガーでCPU使用率が80%超えたらアラートを出すようにテストアラートを設定したので、意図的にCPUの負荷を上げます。yesコマンドでサーバーのCPU負荷が80%超えるようにします。
# CPU負荷を上げる(今回はyesコマンドをバックグラウンドで5回実行することで負荷が80%を超えました) $ yes > /dev/null & $ yes > /dev/null & $ yes > /dev/null & $ yes > /dev/null & $ yes > /dev/null & # cpu使用率を確認する $ top # アラートが発生し、slackに通知が飛ぶことを確認したらkillコマンドでジョブを止める $ kill %1 %2 %3 %4 %5 [1] Terminated yes > /dev/null [2] Terminated yes > /dev/null [3] Terminated yes > /dev/null [4]- Terminated yes > /dev/null [5]+ Terminated yes > /dev/null # ジョブが止まっていることを確認する $ jobs [1] Terminated yes > /dev/null (wd: /usr/lib/zabbix/alertscripts) [2] Terminated yes > /dev/null (wd: /usr/lib/zabbix/alertscripts) [3] Terminated yes > /dev/null (wd: /usr/lib/zabbix/alertscripts) [4]- Terminated yes > /dev/null (wd: /usr/lib/zabbix/alertscripts) [5]+ Terminated yes > /dev/null (wd: /usr/lib/zabbix/alertscripts)
slackにアラートが飛んでいるか確認する
対象チャンネルに通知が来ているか確認します。ちゃんとアラートが飛んできていればOK!
つまづいたところ
ちょっとしたミスが多いですが、つまずいたところです。
zabbixにアラートが上がったのに通知が飛ばない
Zabbixで設定したアクションが有効になっているか確認してみましょう。ステータスが"Disabled"だと通知飛ばないのでご注意。