この記事は Zabbix Advent Calendar 2015 の17日目の記事です。
今回はZabbixとSlackを連携させてChatOpsっぽいことをやってみました。
はじめに
みなさんはZabbixからのアラート通知はどのようにしていますか?
オペレータからの電話? メール? チャット? 手段は色々ありますが、個人的に感じるそれぞれの問題についてまとめてみました。
電話連絡の問題
- オペレータによる24時間365日体制の運用が必要 ⇒高コスト、高負荷。
- 受け手が対応できない状況にある場合でも、通知する側は知るすべがない ⇒通知する側、受ける側に無駄な対応時間が発生
- 情報伝達量の限界 ⇒アラートが複数同時発生した場合やログメッセージの場合、全部伝えるのは時間が掛かりすぎる
- 伝達内容の不正確性 ⇒伝える側の伝え誤り and 受け手の聞き漏らし・聞き間違い
- 受け手が後から通知された内容を振り返れない
当初Twilloのようなクラウド電話APIによる自動化を検討しましたが、解決できない問題が多いため止めました。
メール・チャットの問題
- 受信者が見たかどうかの受諾機能がないため、システム側は1回通知して終わり。受け手が気付かずに障害を長時間放置してしまう可能性。
- 同報で夜間連絡すると、対応しなかった人は起こされ損。
Zabbixのアクションにおけるエスカレーション機能の問題
ちなみにZabbixにはアクションの設定で、エスカレーションを行うための機能が標準で付属しています。
しかし、アクションの実行条件に通常は「トリガーの値 = 障害」という設定を入れていると思いますが、トリガーの値が「正常」に戻ってしまうと、エスカレーションの動作もそこで終了してしまいます。特にログ監視においてトリガーキーに「nodata関数」を使って「正常」ステータスに自動で戻るようにしていたり、トリガー関数「diff」を使って一回だけステータスが「異常」→「正常」になるようなトリガーを設定していると、エスカレーションが行われません。
ZabbixとSlackの連携
上記のアラート通知手段の問題を受けて、以下のような仕組みを作ってみました。
この仕組みで出来ること
- システム側から障害内容をメールで自動通知する
- 担当者が通知を受け取ったことをZabbixの受諾機能を使って管理する
- 担当者が受諾を行うまで、定期的に通知を続ける。また応答が無い場合、連絡先を変えてエスカレーションを行う
- 通知を受けたが時間が経ってからそれに気づいた場合に、現在の対応状況を把握できるよう通知内容と対応状況をタイムラインで管理。
- どこにいても障害内容を受信・受諾可能
- 無料で出来る!←ここ重要
GitHub:zabbix_remote_acknowledged
動作概要
3種類のスクリプトを使います。
1.Zabbixアクション=>Slack連携スクリプト(zabbix-slack-alertscript.sh)
2.未受諾イベントチェックスクリプト(zabbix_event_check.pl)
3.受諾メールチェックスクリプト(zabbix_event_accept.pl)
最初の通知はZabbixのアクションに設定した内容(アラート1次対応者のメールアドレスだけ登録)でメール通知が行われます。同じ条件でSlack連携用スクリプトもアクションに設定しておき、アラート内容と数値型データの場合のみシンプルグラフを取得した上でSlackへアップロードします。グラフはデフォルトで直近3時間程度のデータをSlack上で表示することで、アラート直前のリソース変化の傾向を把握することが可能です。
受諾機能はZabbixイベントの「障害対応コメント」の入力状態をチェックします。「障害」ステータスで、コメントが未入力、かつ発生から5分以上経過しているイベントを検索し、存在する場合は未受諾のイベントがあることをメールとSlackで通知します。またメール送信は送信先リストに従い、リストの順に通知をおこないます。
イベント受諾は受信可能なメールサーバ(Postfix)を用意しておきます。通知を受けたユーザは送信元に空メールを送り、受諾メールチェックスクリプトが新しいメールを見つけるとZabbixに対して「障害対応コメント」をAPIで登録していきます。また同時にSlackへ受諾した旨メッセージを送ります。
尚、通常はSlackのアラート用Channelはnotificationsを無効にしてあり、メールが来たときだけ見るようにしています。
まとめ
電話やメールでは時間が経った後に着信に気づいた場合、誰が対応したか、どのように対応したか、そもそも対応されたのか分からないため、その都度あちこち情報収集する必要があります。しかし、このようにアラート通知と受諾のログ、また対応した内容をSlackのタイムラインで一元管理することで、夜間・休日でも担当者間で素早く情報を共有することが可能になりました。