3台のサーバで取得した値のトリガー条件式

広瀬です

少しご質問ですが、トリガー関数を眺めていておそらく難しいと思うのですが、
3台以上のサーバで取得した同一アイテムをトリガー条件に仕掛け、何れの
値も同一な場合に正常、1つでも異なる場合は異常と判定させたい場合の条
件式というものは作成する事は可能でしょうか?

Zabbixのバージョンは問いません。

文字列の「比較判定」ができないのは認識していますので、あくまでも整数値
です。

よろしくお願いいたします。

コメント表示オプション

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

サーバの台数が増えれば増えるだけ条件式は長くなりますが、
サーバA,B,Cの3台であった場合であれば、

 サーバAの値とサーバBの値を比較して差がない
 かつ
 サーバBの値とサーバCの値を比較して差がない

という状態が正常な状態ですので、これの逆を条件式に追加
すれば良いと思います。

見やすくするため改行を入れますが、

 ({サーバA:アイテムキー.last(0)}-{サーバB:アイテムキー.last(0)}#0)
 |
 ({サーバB:アイテムキー.last(0)}-{サーバC:アイテムキー.last(0)}#0)

という条件式にしてみてはいかがでしょうか?

つまり、複数あるサーバのいずれかの組み合わせで値の差が
あれば障害とみなすわけです。

ユーザー heya の写真

こんにちは。

試していませんが、単純にこんな感じでどうですかね。
{hostA:itemX.last(0)}#{hostB:itemX.last(0)}|{hostA:itemX.last(0)}#{hostC:itemX.last(0)}|{hostB:itemX.last(0)}#{hostC:itemX.last(0)}
・・・と思ったら、右辺は定数しか使えないのか。
https://www.zabbix.com/documentation/2.2/manual/config/triggers/expression
{<server>:<key>.<function>(<parameter>)}<operator><constant>

スクリプトに頼るしか無いのかなあ。ちょっと考えてみました。

値を取得
→トリガーで、値が何でも無条件で障害扱い
→アクションでスクリプト※
→そのスクリプト内で・・・
 値を値記録用のファイルに書く
 値が三つ揃っていたら
   比較する
   結果を結果記録用のファイルに書く
   値記録用のファイルを削除or中身を消す
そして、結果記録用のファイルの中身を vfs.file.contents か何かでチェックする
※実際はそれ用のメディアとユーザーを用意することになると思います。

どうもまどろっこしいですね。

ユーザー heya の写真

書いている間に TNK さんから返信がありましたね。
確かに引き算なら問題なさそう・・・気づきませんでした。

ユーザー KAZ の写真

TNKさんと似たようなこと考え検証してました。(笑)

私の場合は、計算アイテム使いました。
Zabbix2.2.3では問題なく動きましたよ。

計算アイテムで下記の2アイテム登録して

計算アイテム1
last("{HOST1:アイテムキー}",0)-last("{HOST2:アイテムキー}",0)

計算アイテム2
last("{HOST1:アイテムキー}",0)-last("{HOST3:アイテムキー}",0)

トリガー
({サーバ:計算アイテム1キー.last(0)}#0)
&
({サーバ:計算アイテム2キー.last(0)}#0)

条件式は短いのですが、アイテム条件分アイテム増えちゃうのが…A(^^;

広瀬です

TNKさん、heyaさん、KAZさん、ご返答ありがとうございます。
アイテム側で計算アイテムを使う方法ですねー。それも一つの手でしたね。考えなかった訳ではありませんでした。

結果的にはTNKさんの解説とほぼ同じ理論に辿りつき、トリガーで以下の様にしてみました。

(({host001:itemkey.last(#1)}-{host002:itemkey.last(#1)})#0)
|
(({host001:itemkey.last(#1)}-{host003:itemkey.last(#1)})#0)
|
(({host003:itemkey.last(#1)}-{host003:itemkey.last(#1)})#0)

(((ホスト1のアイテムの値)-(ホスト2のアイテムの値))#0)
|
(((ホスト1のアイテムの値)-(ホスト3のアイテムの値))#0)
|
(((ホスト2のアイテムの値)-(ホスト3のアイテムの値))#0)

3台のホストなので、3通りの計算式のみで成立はできるかと思うので、何れのアイテムの差が「0」
以外ならば「真」となり、「0」なら「偽」となるようにしてみました。

 ※ホスト3-ホスト2、ホスト2-ホスト1などもある方がよいかもとは思いましたが、ぶっちゃけそ
   こまで正確性は必要無いため排除しました

いちをトリガー条件画面の「入力方式の切替」から使えるテストですべてのパターンを試したところ
使えそうだという判断に至りましたが、如何でしょうか?
念のためですが、アイテムは整数値にしていますが、あれって確かBIGINT型で良かったでしょうか?

-閑話休題-
本件複数台のサーバ上に配置している静的公開ファイルが改ざんされていないかをチェックする目
的にも使えるなーなどと思った次第です。実はアイテム値はトラッパーで上げているCRC値です。

 ※vfs.file.cksum[file]を使わない理由は対象のファイルの生成が特殊なため