ESXiから外部チェックを使って値を取得する場合の、ローレベルディスカバリ(LLD)とアイテムのプロトタイプの設定について

Zabbixが標準で提供しているテンプレートではあまり細かな情報が取得できないため、外部チェック(自身が作成したスクリプト)で値を取得しようと思っています。
対象はESXiと仮想マシンです。

ESXiには値が1つのもの(CPUの個数等)と複数のもの(ESXiがマウントしているデータストア名等)があります。今回お聞きしたいのは、複数のものを取るときの事です。

ローレベルディスカバリを利用しようと思っています。
複数のデータストア名を取得し、json形式で出力するスクリプトを書いたのですが、ローレベルディスカバリとアイテムのプロトタイプはどのように設定すればいいてしょうか?

通常ローレベルディスカバリで複数の値を取得しjson形式に出力した後、アイテムのプロトタイプでそのjsonの値(戻り値)を引数にして何かしらの値をとるようにすると思いますが、スクリプトだけで複数の値が取れてしまうので、ローレベルディスカバリとアイテムのプロトタイプは何を設定すれば良いかわかりません。
教えて下さい。

コメント表示オプション

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

LLDの「ディスカバリ用アイテム」を定義する必要があります
 #ファイルシステム検出での vfs.fs.discovery にあたるもの

アイテムをUserParameterとして設定したうえで、実行されるスクリプト内で
JSON形式の文字列を返却する動作とするだけです

JSONに埋め込む「置換キー」のようなものを上手く定義することで
「ディスカバリ結果から生成・量産されるアイテム・トリガー」のパラメータ部を
自由自在にできます
 #ファイルシステム検出での vfs.fs.size[xxxx] にあたるもの

以下、前佛さんの記事、うしださんの記事、手前味噌ですが小生のスライドが参考になるかと
 http://pocketstudio.jp/log3/2013/07/08/howto-zabbix-low-level-discovery/
 https://qiita.com/usiusi360/items/51e8478cb080412958a4
 https://www.slideshare.net/takeshiyamane9/lld-zabbix

ユーザー hm の写真

fripperさん

お返事ありがとうございます。

自作のスクリプトを/usr/lib/zabbix/externalscripts配下に置き、LLDのキーにそのスクリプトパスを記載しました。
この結果、以下のような値(jsonオブジェクト)が返るようにしました。

{"data": [{"{#AAA}": "aaa"},
{"{#AAA}": "bbb"},
{"{#AAA}": "ccc"}]
}

次にアイテムのプロトタイプですが、ここは例えばどのように書けばいいですか。
上の例で言えば、aaa、bbb、cccが欲しい結果(=zabbixのDBに格納したい値そのもの)です。
試しにアイテムのプロトタイプに{#AAA}とだけ書いてもエラー(設定不可)でした。

ユーザー fripper の写真

ZabbixのLLDは、複数の対象に対して、同じようなアイテム・トリガー等の
監視項目を作成したい場合に利用します
ディスクの容量監視を実施したいけど、複数のマウントポイント・ドライブが存在している、や
ネットワークのトラフィック監視を実施したいけど、複数のインタフェースが存在している、のような感じ
データストアの監視を例に採った場合には、以下のような感じでしょうか

LLDの「ディスカバリ」用のスクリプトとして、以下のようにUserParameterのスクリプトを1つ定義します
UserParameter=user.datastore.discovery /bin/sh ds-discovery.sh

スクリプト(ds-discovery.sh)が返す値は、ディスカバリで複数生成させたい「要素」を識別できるような値を
JSON記載したものとします

{"data": [{"{#DS_NAME}": "datastore1"},
{"{#DS_NAME}": "datastore2"},
{"{#DS_NAME}": "datastore3"}]
}

上記を返すことによって、Zabbix側は「どんな要素があるか」を認識し
個々の「要素」に対して、「プロトタイプ」で設定されたアイテム・トリガーを
自動生成するようになります

プロトタイプから自動生成されるアイテム側についても、UserParameterを利用して
個々のデータストア領域について、監視したい項目毎にスクリプトを別途作成します
 総容量を取得するスクリプト:ds-get-capacity.sh
 空き容量を取得するスクリプト:ds-get-freearea.sh

スクリプト(ds-get-capacity.sh / ds-get-freearea.sh)は、個々の「要素」に対して個別に
実行されるので、スクリプトの引数として「要素名」を受け取って、それに対する
値を返すように作ります
容量監視等の場合には、単純な「バイト値」を整数値として出力するように作るのが
その後の扱いが楽になって良いと思います

server$ sh ds-get-capacity.sh datastore1
1000000000
server$ sh ds-get-capacity.sh datastore2
2000000000
server$ sh ds-get-freearea.sh datastore2
594996921

作成したスクリプト(ds-get-capacity.sh / ds-get-freearea.sh)を
UserParameterに記載する場合の定義は、以下のような形になるかと思います

UserParameter=user.datastore.capacity[*] /bin/sh ds-get-capacity.sh $1
UserParameter=user.datastore.freearea[*] /bin/sh ds-get-freearea.sh $1

zabbixのアイテムキーに与えたパラメータ値を、スクリプトの引数として
渡すような感じです

このUserParameterで作成したアイテム設定を、LLDの「アイテムのプロトタイプ」にて
以下のような形で設定します

名前:   データストア総容量 [$1]
キー:   user.datastore.capacity[{#DS_NAME}]
値の形式: 整数値

これで、個々のデータストアに対するアイテムが、自動生成されるようになるはずです
ご確認ください

ユーザー hm の写真

fripperさん

お返事ありがとうございます。
頂いた情報を参考にしたうえで、あの後諸事情あり、まずはデータストアのUUIDをjson形式で出力し、アイテムのプロトタイプでそれを引数にしてデータストア名を取得することになりました。
スクリプトは一旦作成し、zabbixに登録しましたが、以下のようなエラーメッセージが出ます。再三大変申し訳無いのですが、アドバイスいただけましたら幸いです。

ディスカバリルールのところで以下のようなエラーメッセージが出ます。
---
Cannot create item: item with the same key "AAA.py["-s", "{$SERVER}", "-t", "esxi_ds_name", "-i", "{#ESXi_DS_UUID}"]" already exists.
---
※AAA.pyはスクリプト名です。また、{$SERVER}は対象サーバのIPアドレス(マクロ)です。
※zabbixに登録せずにスクリプトだけで実行してみたところ、意図した通りの動作(UUIDをキーにDataStore名の取得に成功)しました。

■補足 zabbixへの設定内容は以下の通りです。
<ディスカバリルール>
名前 : ESXi_DS_UUID
タイプ : 外部チェック
キー : AAA.py["-s", "{$SERVER}", "-d", "esxi_ds_uuid"]

<アイテムのプロトタイプ>
名前 : esxi_df_name {#ESXi_DS_UUID}
タイプ : 外部チェック
キー : AAA.py["-s", "{$SERVER}", "-t", "esxi_ds_name", "-i", "{#ESXi_DS_UUID}"]
データ型 : 文字列

ユーザー hm の写真

すいません、自己解決しました。

{#ESXi_DS_UUID}を {#ESXDSUUID}に変更したところエラーが消え、問題なく情報が取れるようになりました。