指定文字列の数をトリガー条件にする
初歩的な質問ですが、どなたかご教示ください。
●監視対象サーバ
- CentOS 7
●Zabbixサーバ
- Zabbix3.0.23
- CentOS 7.6
●問題
スクリプト結果に"OK"が5つ含まれない ←つまり"OK"数が4つでも、6つでのアラート対象
もしくは、NG or WARNが含まれる
でアラート対象にしたいのですが、
うまく動きません。
↓下記指定で何か問題ありますでしょうか。
・アイテム
タイプ:SSHエージェント
キー:ssh.run[test]
実行するスクリプト:cat /tmp/test.txt
データ型:テキスト
・トリガー
条件式
{xxxx:ssh.run[test].regexp("OK",#5)}=0 or {xxxx:ssh.run[test].iregexp(NG|WARN)}=1
heya - 投稿数: 319
regexp の二つ目のパラメーター #n は、「今回のデータ内にn個あるか」というチェックをするものではなく、「過去n回分のデータのどれかに指定したパターンを含んでいるか」というチェックをするものです。
一つの regexp で実現しようとすると、かなりややこしい正規表現になりそうな気がします(ひょっとしたらできないかも)。
複数の regexp を使うなら
{~.regexp("(OK.*){5}")}=0 or {~.regexp("(OK.*){6}")}=1 or {~.iregexp("NG|WARN")}=1
といった感じでしょうか。OK が5つ含まれていない or OK が6つ以上含まれている or NG か WARN が含まれているなら障害、ということです(. が改行も含むかどうかは自信がないので、その辺は実際に試してください)。
それか、スクリプトの実行結果が「OK を5つ含むかどうか」をチェックするためだけに使われるものなら、そのスクリプトの最後の方で OK と NG/WARN の数を数えて「OK が5つで NG 無しなら 0、そうでなければ 1」を出力するように改造するという手もあります。この場合、アイテムのデータ型は数値(整数)になります。
スクリプトの実行結果がこのチェック以外にも使われるなら、スクリプトの出力を別のスクリプトにも渡して(tee コマンドを使うと楽)、そちらで OK と NG/WARN の数を数えて、あとは上記のように出力すればいいです。