Zabbix APIを使ったホスト登録スクリプトを Zabbix 1.8.3と1.8.4の両対応にさせてみたの記。
Zabbix 1.8.4が出て、以前の記事に載せていたホスト登録スクリプトがそっちでは動作しなかったので、1.8.4のAPIを調べて対応させてみました。せっかくなので、その時の記録を書いておきます。手っ取り早くスクリプトを見たい方は、僕のZabbixToolsのGithubの該当ページへ。
* * *
さて、さっそくやった内容に入りますが、スクリプトを改定するに当たってまずはAPIのバージョンごとに動作を変更するようにせねばと思い、Zabbix API のドキュメントを調べてみました。すると、"apiinfo.version"というAPIがあることを発見。それでAPIバージョンを確かめてみました。このバージョンの違いでロジックを切り替える目論見です。
Zabbix APIの戻り値の確認には、以前のブログに書いた"get_zabbix_data.pl"*1が使えます。もともと、APIを試してみるためにつくったものでしたが、"--method"オプションに"*.get"を入れると、だいたい値が返ってくるので自分自身かなり重宝してます。
さて、それで1.8.3のサーバの"apiinfo.version"を叩いてみた結果がイカ*2です。
【コマンド】
perl get_zabbix_data.pl --method apiinfo.version --zabbix_server 192.168.11.201(←Zabbix 1.8.3のサーバ)
【戻り値】
{ "jsonrpc" : "2.0", "id" : 1, "result" : "1.3" }
ということで、Zabbix 1.8.3のAPI Versionは1.3ということがわかりました。では、続いて1.8.4のサーバを調べてみます。
【コマンド】
perl get_zabbix_data.pl --method apiinfo.version --zabbix_server 192.168.11.202(←Zabbix 1.8.4のサーバ)
【戻り値】
{ "jsonrpc" : "2.0", "id" : 1, "result" : "1.3" }
!?
完全に一致w
この通り、1.8.3から1.8.4では、"apiinfo.version"のバージョンは上がってませんでした。。。
Zabbix本家のAPIドキュメントは、マイナーバージョンアップごとに上書きされてしまうようです。APIドキュメントの冒頭には、"Currently Zabbix API specification is in draft state."と書いてあるので、今回の変更はバージョンアップではなくて、ドラフトの変更という位置づけということなんでしょう。
ただ、すでにAPIつかったツールをつくってしまった立場としては、せめてAPIバージョンを0.0.1でもあげて返してくれるとありがたかったなー
仕方ないので、今回の改訂ではバージョン番号での分岐はあきらめ、まずは1.8.4として扱ってダメだったら1.8.3と見做すという風に対応しました。
* * *
まあ、ちょっと文句を書いてしまいましたが、今回の仕様変更でAPIアクセスとレスポンスの形式が統一化されているので、全体としては使いやすくなっています。例として、ホスト追加スクリプトで引っかかった"template.get"(Zabbixの監視テンプレート情報を返すAPI)を見てみます。
下に貼り付けたのが、1.8.3のときのtemplate.getの結果。(冒頭に紹介したスクリプトを使っています)1.8.3の形式は、"result"の下に"10001"などのテンプレートIDをキーとしたJSONの塊があり、さらに下にも"templateid"が入っているという気持ち悪い構造でした。また、ほかの"*.get"メソッドともデータの格納形式が違ったので、"template.get"だけ情報取得のロジックを変えないといけませんでした。
{ "jsonrpc" : "2.0", "id" : 1, "result" : { "10001" : { (略) "ip" : "", "status" : "3", "templateid" : "10001", "lastaccess" : "0", "hostid" : "10001", "ipmi_port" : "623", (略) }, (以下略)
次のものは1.8.4のときのtemplate.getの結果。"result"の下には、テンプレートのリストが格納されている形式に変更されています。これはほかの".get"系メソッドの形式と同じものです。
{ "jsonrpc" : "2.0", "id" : 1, "result" : [ { (略) "ip" : "", "status" : "3", "templateid" : "10001", "lastaccess" : "0", "hostid" : "10001", "ipmi_port" : "623", (略) }, (以下略)
ほかにもhistory.getのパラメータ指定もほかの"*.get"メソッドと形式が統一されたようです。今回の調査で使っているスクリプトは、1.8.3ではhistory.getに対応していなかったのですが、1.8.4ではhistory.getもできるようになりました。(そのままでは実用にはなりませんが)
APIは、今回の改訂でかなり統一感が出たので、このまま安定するような気がします。*3
少なくともこれからAPIを使ったツールをつくる人には扱いやすくなっているはず!
みんなも、いろいろつくってみてね!w