ZabbixAPI item.get

本項ではアイテムの情報取得を行うAPIについて記載する。

http://kyou.hatenadiary.jp/entry/2017/12/25/233314
ZabbixAPIを使うメリット で記載した「登録済みトリガーの閾値を一定のルールで置換する場合」の前準備として使用する。

通常のホストやテンプレートごとのアイテム登録状況はZabbixGUI画面上は割と見やすいが
テンプレートやホスト横断的に取得する場合に取得する場合はZabbixAPIで取得した方が楽な場合が多い。
アイテム名やアプリケーション単位であれば良いが、特定アイテムキーを使ってる箇所などはZabbixGUI側が対応してないからである。

http://kyou.hatenadiary.jp/entry/2018/01/01/010131
ZabbixAPIを使う作業環境 で記載した環境のため、json2zabbix.shで使うJSON形式を作成して実行する方式とする。


また、Zabbix公式Docで参照するページは以下2つになる
https://www.zabbix.com/documentation/3.0/manual/api/reference/item/object
https://www.zabbix.com/documentation/3.0/manual/api/reference/item/get

公式Docのアイテム作成JSONのサンプルは以下のとおり
{
"jsonrpc": "2.0",
"method": "item.get",
"params": {
"output": "extend",
"hostids": "10084",
"search": {
"key_": "system"
},
"sortfield": "name"
},
"auth": "038e1d7b1735c6a5436ee9eae095879e",
"id": 1
}

各パラメータの詳細を記載する。
jsonrpc: これは"2.0"固定

method: "item.get"でアイテム作成を指定する。必須項目。

output: 出力形式を指定する。基本的にextendで良い。

hostids: このアイテムを追加するホストIDもしくはテンプレートIDを指定する。必須項目。Zabbixの内部管理上、ホストとテンプレートは区別されてなく、両者ともhostidという5桁の数字で管理されホストとテンプレート通じて一意である。また数値ではなく"数字"であるため、ダブルクォーテーションで括って文字列指定をする必要がある。よく忘れる。また特定のホストやテンプレートのIDを調べる場合、ZabbixGUI画面上のURLを調べると5桁数字が入っているのがそれである。
複数のホストやテンプレートを指定したい場合はここを配列にして渡せば良い。

search: 取得するアイテムの条件を指定する。item.get固有ではなく共通パラメータである。また、jq側のクエリで捌く方法もある。

sortfield: 出力するデータの出力順を制御する。jqで制御したり、jq処理後のbash側で処理しても良い。
個人的には最終的にcsvっぽくする場合が多いのでbashでsortすることが多い。

auth: ZabbixAPIの認証トークン。必須項目。json2zabbix.shの場合は ##TOKEN## を記載する。

id: ZabbixAPIの実行ID。必須項目。とりあえず1で良い。


上記以外で個人的に割と使うパラメータは特にないが、むしろitem.getの出力結果をjqで処理するケースが多い。
また稀なケースとして、各テンプレートやホストごとのアイテム一覧を生成する際などは基本となるitem.get用のJSONを書いておき
host.getやtemplate.getで取得したhostidを次々置換しながら、各アイテムを一覧出力する場合もあった。

本項では以降item.getよりjqのクエリの書き方に焦点を移す。

item.get自体はhostidsを変えて使いまわし、以降はパイプ渡しするjqで処理を任せることが多い。
例えば
bash json2zabix.sh item.get.json | jq -c ".result|[.itemid,.name,.key_]"
という具合に、各行にアイテムID、アイテム名、アイテムキーを3つ並べた一覧を出力する。

ちなみに
bash json2zabix.sh item.get.json | jq -c ".result|[.itemid,.name,.key_]|@csv"
というようなjqの機能でcsvフォーマットなどで出力できるが、文字列のダブルクォーテーションをバックスラッシュエスケープで出力されて
個人的に見づらいためあまり使用はしていない。

jqクエリの分かりづらい箇所として .name という先頭にドットを付けて各フィールドの名前を指定する必要がある。
ドットをつけない場合はjqはそれをラベルとみなしてしまう。

また、.result はresultフィールド配列全体要素を指す。item.getで10個のアイテムを取得したらそれ全てを指定している。
そして .result
| でパイプを加えると以降のクエリはresult配列内を指すようになる。
その後 [.itemid,.name,.key_] で3つを配列として出力する、というクエリになる。

jq に -c のオプションをつけているのは改行抑止で、アイテムID、アイテム名、アイテムキーを纏めて1行で出して欲しいからである。

またjqのクエリに先にラベルをつけておいて、後続作業でitem.updateの処理をしやすくするなどもあるが
個人的にはそれは後々にテキストエディタの置換処理でつけることが多い。
(あまりラベルをつけてjqの出力を出す習慣がないからであるが)

これらの結果を使って、今の監視設定の状態を把握したり、item.update用のJSONを起こしたりする。
item.updateについては別ページにて詳しく記載する。