第4回 障害発生通知 (5/5)

技術特集

1_zabbix4_tit

tit_zabbix
5)アクションのカスタマイズ例

先にもご紹介した通り、障害発生時にサービスを再起動するような仕組みを考えたいと思います。

 

例として、Webサーバ(httpd)のプロセスが停止してしまったときに、自動的にhttpdのプロセスを起動させることとします。

各サーバとプロセスとの関係は、以下の図のような関係になります。

zbx_action_process

ZabbixサーバがZabbixエージェントからhttpdプロセスの稼働数を取得して、トリガーの条件式でプロセス数が0の状態が3分続いたら障害をみなすこととし、障害を検知したら、Zabbixエージェント経由で監視対象上でコマンドを実行して、httpdプロセスを起動しようと試みるように設定してみます。

事前準備として、Zabbixエージェントからhttpdを起動させるためには、Zabbixエージェントを起動しているOS上のzabbixユーザが、sudo を利用してhttpd用のserviceコマンドを実行できるようにしておく必要があります。

そのためには、

  • zabbixユーザのシェルの変更
  • visudoでsudo 権限の付与

を行っておく必要があります。

デフォルトでは、zabbixユーザのログインシェルは「/sbin/nologin」になっているため、そのままではsudo を利用してコマンドを実行することができません。
そこで、ログインシェルを/bin/shに変更します。

1
# usermod -s /bin/sh zabbix

次に、visudoコマンドを利用してzabbixユーザにパスワードなしで、httpdプロセスの再起動を実行できるよう、以下の行を最後の行に追加して保存します。

1
zabbix ALL=(ALL) NOPASSWD: /etc/init.d/httpd restart

同時に、Zabbixエージェントからのsudo コマンド実行になるので、以下のようにttyに関する設定は、#でコメントアウトしておきます。

1
#Defaults    requiretty

Zabbixエージェント自体の設定も変更が必要です。
Zabbixサーバからのリモートコマンドを受け付けられるようにするために、zabbix_agentd.conf内に以下の設定が必要になります。

1
EnableRemoteCommands=1

設定を変更したらZabbixエージェントを再起動しておいてください。
そして、Zabbix上の設定ですが、先の説明の通り、アイテム、トリガー、アクションを追加していきます。

まず最初はアイテムの作成です。

「設定」->「ホスト」でホスト一覧を表示させ、今回設定したいホストの「アイテム」をクリックしてアイテムを一覧表示させます。
その後、右上の「アイテムの作成」ボタンをクリックしてアイテムの作成を開始します。

httpdプロセスのプロセス数を取得したいので、以下のように設定します。

  • 名前: Apacheプロセス数
  • タイプ: Zabbixエージェント
  • キー: proc.num[httpd]
  • データ型: 数値(整数)
  • データの形式: 10進数
  • 更新間隔(秒): 30

zbx_action_createitem

実際に試すために、監視対象のホスト上でhttpdを起動しておきます。

1
# service httpd start

「監視データ」->「最新データ」で起動したhttpdのプロセス数が取得できていることを確認しておいてください。

続いてトリガーの設定です。

先ほどと同様に、ホスト一覧から対象のホストの「トリガー」をクリックしてトリガー一覧を表示させ、右上の「トリガーの作成」ボタンをクリックしてトリガーの作成を開始します。

今回は、3分間httpdプロセスが停止していたら障害とみなすこととしますので、以下のような条件式を利用して指定します。

  • 名前: Apacheプロセス停止
  • 条件式: {ホスト名:proc.num[httpd].avg(180)}=0
  • 障害イベントを継続して生成: チェックなし
  • 深刻度: 重度の障害

zbx_action_createtrigger

そして、アクションの設定です。

アクションの設定は、「設定」->「アクション」でアクション一覧を表示後、右上の「アクションの作成」ボタンをクリックしてアクションの作成を開始します。

今回設定しているトリガーのみで実行されるようにしたいので、アクションの実行条件として、トリガー名も条件に加えて、以下のような設定を行います。

「アクション」タブ

  • 名前: Apache再起動

「アクションの実行条件」タブ

  • 計算のタイプ: (A) and (B) and (C)
  • アクションの実行条件:

(A) メンテナンスの状態 期間外 メンテナンス

(B) トリガーの値 = 障害

(C) トリガー名 含まれる Apacheプロセス停止

「アクションの実行内容」タブ

  • 実行内容のタイプ: リモートコマンド
  • ターゲットリスト: 現在のホスト
  • タイプ: カスタムスクリプト
  • 次で実行: Zabbixエージェント
  • コマンド: sudo /etc/init.d/httpd restart

zbx_action_action1


zbx_action_action2


zbx_action_action3


設定後には、必ず「保存」ボタンを押して保存することを忘れないようにしてください。

設定が終了したら、実際に動くかどうか試してみましょう。

アイテム作成時にhttpdは起動しておいたはずですから、最新データの値としてプロセス数が取得できていることをまずは確認しておきます。

確認できたら、あえて監視対象のホスト上で、

1
# service httpd stop

と実行してhttpdを止めてしまいます。

最新データの値として、0になってしまったことを確認してください。

3分経過すると、トリガーの条件に合致して障害のイベントが発生してアクションが実行されます。
先ほど登録したアクションも実行されるので、監視対象のホスト上で「sudo /etc/init.d/httpd restart」が実行され、その後に最新データの値が正常時のプロセス数に戻るはずです。

Zabbixの最新データに反映されるまでに多少時間がかかりますが、より早く確認したい場合は、再度最新データの画面を開き直すなどの操作を行ってみてください。

実際に実行されたかどうかは、イベントの詳細画面でも確認することができます。

「監視データ」->「イベント」とイベント一覧を表示させ、障害を検知したときの日時をクリックしてみてください。

以下のような表示が確認できると思います。

zbx_action_eventdetail

この例では、メール通知のアクションも設定されていたので、メール通知の「メッセージアクション」と、今回設定したリモートコマンド実行の「コマンドアクション」の両方が実行されたことを確認できます。