メンテナンス中のアクションについて

お世話になっています。

Zabbixサーババージョンは2.0.3になります。

監視対象サーバでは、メンテナンス期間中に特定プロセスの落とし上げを実施しているのですが、
このプロセス起動時に検知される復旧イベントで実行されたアクションが、メンテナンス終了時に再度実行されてしまうという事象が発生しております。

※Zabbix管理画面のイベント画面には該当イベントは実際の復旧タイミングにしか出力されていません。また、該当イベントの詳細ページのコマンドアクション欄にも、復旧タイミングにアクションにコマンドが実行されたという表示しかありません。(メンテナンス終了時にコマンドが実行されたという表示はありません。)

なんとかメンテナンス終了時のアクションが実行されないようにできないか調べているのですが、手詰まりな状態です。もし、解決方法をご存じの方がいらっしゃいましたらご教授願えませんでしょうか。

メンテナンス、アクション、アイテム、トリガーの設定は以下になります。
メンテナンスの設定は以下になります。
毎夜0時~6時を以下の設定でメンテナンスを設定しています。
メンテナンスタイプ:データ収集あり
期間タイプ:毎日
繰返し間隔:1
開始時刻:0時
メンテナンス期間:6時間

アクションの設定は以下になります。
・実行条件
設定なし
・アクションの実行内容
開始:1
終了:1
ステップの期間:0
実行内容のタイプ:リモートコマンド
ターゲットリスト:現在のホスト
タイプ:カスタムスクリプト
次で実行:Zabbixサーバ
コマンド:”メール送信用スクリプトを記述しています。”
アクションの実行条件:なし

アイテムの設定は以下になります。
キー:proc.num[,,,プロセス名]
トリガーの設定は以下になります。
条件式:{ediliteapdb:proc.num[,,,プロセス名].last(0)}<1

以上、よろしくお願いいたします。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー KAZ の写真

kazumasuzuさん

Zabbix2.2系で調べたのでもしかするとちょっと違うかもしれませんが…A(^^;

データ収集ありの場合、メンテンス期間中にイベント発生するとメンテンス中もメンテナンス期間終了時に同じイベントが生成されます。
※:Zabbix仕様です。

つまり…
メンテンス期間中に障害が発生するとメンテナンス期間終了時に障害イベントが生成されます。
メンテンス期間中に障害が発生し回復するとメンテナンス期間終了時に正常イベントが生成されます。

その為、アクションの実行条件で下記を設定しないとメンテナンス期間中でもアクションは実行されます。
・メンテナンスの状態 期間外
※:マニュアルにも書いてあります。

また、メンテナンス期間終了後の正常メッセージですが、下記を設定しないと送信されます。
・トリガーの値 = "障害"
※:マニュアルに書いてないですね…A(^^;

なので、アクションの実行条件には下記をします。(Zabbix2.2系のデフォルト)
・メンテナンスの状態 期間外
・トリガーの値 = "障害"

上記の設定だけでは回復メッセージが飛ばないですが、
アクションの「リカバリメッセージ」を有効にすることで、
通常の回復メッセージが飛ぶようになります。

リカバリメッセージは実行されたアクションのトリガーの値が障害から正常になった時に実行されます。
メンテンス期間中に障害イベントは発生していますがアクションが実行されていないので、
メンテンス期間終了後に回復メッセージは送信されることはありません。

ちょっと複雑なのでお手持ちの環境で試された方が良いかと思います。
尚、メンテンス期間の設定を変更すると反映されるまでに最大1分かかります。(Zabbixサーバが1分周期にタイマーで設定反映しているようです。)

ユーザー kazumasuzu の写真

お世話になっています。
ご指摘の設定、
・メンテナンスの状態 期間外
・トリガーの値 = "障害"
を設定し、アクションの「リカバリメッセージ」を有効にしたところ、メンテ期間中にアクションが実行されなくなってしまったため、
”・メンテナンスの状態 期間外”を削除してみました。

結果、障害時アクションは実行されるのですが、復旧時アクションが実行されません。
アクションの「リカバリメッセージ」オプションは、実行内容のタイプが”メッセージの送信”の時のみ有効なのでしょうか。

やりたいことは、
メンテ期間中に発生した障害及び復旧について、発生したタイミングでのみアクションを実行し、メンテ終了時にはアクションが再実行されない設定
となります。

メンテナンス設定を削除すれば、上記の”発生したタイミングでのみアクションを実行”は簡単なのですが、
他のアクションで、アラートランプの点灯を行わせており、メンテナンス期間中はこのアクションの実行を抑止したいため、メンテナンス設定を削除できないです。
なんとか、メンテナンス設定を削除せずに、”メンテ期間中に発生した障害及び復旧について、発生したタイミングでのみアクションを実行し、メンテ終了時にはアクションが再実行されない設定”を実現できないでしょうか。

以上、よろしくお願いいたします。

ユーザー KAZ の写真

kazumasuzuさん

メンテナンス設定を削除すれば、上記の”発生したタイミングでのみアクションを実行”は簡単なのですが、
他のアクションで、アラートランプの点灯を行わせており、メンテナンス期間中はこのアクションの実行を抑止したいため、メンテナンス設定を削除できないです。
なんとか、メンテナンス設定を削除せずに、”メンテ期間中に発生した障害及び復旧について、発生したタイミングでのみアクションを実行し、メンテ終了時にはアクションが再実行されない設定”を実現できないでしょうか。

一個前で書きましたがZabbixの仕様でデータ収集ありの場合メンテナンス終了後に必ずイベント発生します。
これをアクション条件で判断させるのは難しいです。
※:アクションの条件でメンテナンス期間終了時のイベントか判断できない為

考えられるのは実行されるアクションのメディアタイプをスクリプトにして
スクリプトの中でメンテナンス時間帯の物か判断させるスクリプトを書く位でしょうか?

Zabbixの基本機能ではかなり難しいです。

ユーザー kazumasuzu の写真

KAZさん
回答ありがとうございます。

なるほど、Web画面からの設定では不可なんですね。

>スクリプトの中でメンテナンス時間帯の物か判断させるスクリプトを書く位でしょうか?
スクリプトで何とかする方向で挑戦してみようと思います。
以下のような流れを考えてみました。
・アクションスクリプトに{EVENT.ID}を引数で渡して、それをファイルに書き出します。
・アクションスクリプトは、実行毎に上記のファイルを確認し、ファイル内に{EVENT.ID}があった場合は、処理の実行をスキップする
これにより、メンテナンス終了時の2回目のアクション実行時は、処理がスキップされると考えています。

そこで、質問なのですが、
{EVENT.ID}は、イベント発生毎に作成される完全ユニークな番号になるのでしょうか。

以上、よろしくお願いいたします。

ユーザー KAZ の写真

kazumasuzuさん

そこで、質問なのですが、
{EVENT.ID}は、イベント発生毎に作成される完全ユニークな番号になるのでしょうか。

そのはずです。
少なくともeventsテーブルではユニーク・キーになってます。

■付け足し
メンテナンス期間終了時に作成されるイベントも別のイベントIDが作成されると思います。
ZabbixのWeb GUIをデバッグモードで実行して確認してみてください。

ユーザー kazumasuzu の写真

間が空いてしまい申し訳ありません。
回答ありがとうございます。

確かに、メンテナンス期間終了時に作成されるイベントも別のイベントIDが作成されていました。
よって、スクリプト側でIDのチェックするというのはあきらめました。

メンテナンス設定をなくし、各アクションに実行期間を設定することで対処することにしました。

いろいろとご助力いただきありがとうございました。