やりたいこと
例えば、httpdサービスが停止した(httpdプロセス数が0個になった)場合、Zabbixでアラーム(トリガ)として検知します。
ここまでは普通ですが、
その後、そのトリガをアクションの条件として、障害発生サーバのhttpdサービスを復旧したら楽ですよね。
やりたいことの考え
ワークアラウンドとしてまず浮かぶのは、(1回目のアラーム時)停止サービスを再度起動してみることですよね。
だったら、人間様じゃなくてZabbix君にやらせてしまいましょう。
それも再度落ちるようなら(2回連続アラームなったら)、人間様にご登場いただくと云う寸法で。
今回の実現環境
- ZabbixServer側:zabbix3.0
- ZabbixAgent(httpdサービス起動)側:zabbix-agent導入済みのCentOS7
ざっくりした実現方法
- zabbix-agent経由で、httpdサービス停止を検知
- zabbix-serverでトリガ発報
- トリガでアクションが発動
- アクションで、Zabbix-agent側でshellコマンドを発行
- shellコマンドで"systemctl start httpd.service"をsudoで実行
- httpdサービス復旧
実現方法
ZabbixSever側
ITEM設定
名前を「httpd.service process」と設定。最初の1ワード目が、"systemctl で使用する"httpd.service"と同じ文字列であることがミソ(アクションのコマンドで使用します)。
TRIGGER設定
名前を「httpdサービス停止(自動再起動処理有)」とし、日本語部分を固定フォーマットにすることがミソ(アクション設定時にこの文字列をキーワードにする)
ACTION設定
アクション設定です。アクションの名前は何でも良いです。
アクションの条件に、3行目(トリガー名 含まれる 「サービス停止(自動再起動処理有)」)を加える。
トリガで使用した文字列「サービス停止(自動再起動処理有)」が存在すればアクションを起こすようにする。
実行内容は、Zabbixエージェントで、下記のようなコマンドを実行するよう指示する。
]
ZabbixAgent側
実現方法として、Zabbix-agentをrootユーザで稼働する方法と、sudoを使用する方法がある。
今回は、既存システムに影響が少ないsudoを使用する方法を採用する。
/etc/sudoers設定
visudoコマンドで、/etc/sudoersの最終行に追加。
zabbix ALL=(ALL)NOPASSWD: /usr/bin/systemctl start httpd.service, /usr/bin/systemctl start chronyd.service
実行結果
イベントログを見ていると、サービス停止後、ひとつのアクションが実行され復旧していることがわかる。
アクション内容も、設定したマクロ{ITEM.NAME}が思ったとおりに展開されていることが確認できた。
最後に
見ていただければわかるように、アイテム「httpd.service process」(マクロの{ITEM.NAME})のhttpd部分を別のサービス名(e.g. chronyd等々)に変更すれば汎用的に利用可能です。
また、実際の現場では、サービスは起動はOKだが、「Webシナリオ」でエラーとなる場合に、httpd/mysqldサービスの再起動を実行する等すれば、少しは使い物になると思います。
今回は例としてsystemctlコマンドでした。
が、ansibleと連携することで、Webシナリオ等のサービス障害検知時に、設定状況の差異修復を行えば良いと思う。
最後の最後に
もし本番でこのような仕組みを使うのであれば、メンテナンス時にZabbix機能の「メンテナンス」を使用することをおすすめします(アクションの条件にもデフォルトで入っています)。
もし使用しなければ、メンテナンス中にZabbixが勝手にサービス再開してしまいますから…(怖い怖いw)