Zabbix APIを使って値を取ってみる

Zabbix APIJSON-RPC形式です。
とりあえず今回は、curlコマンドを利用して値を取得してみます。

まず、Zabbix Server側の設定でAPIアクセスを許可するユーザを作成してあげます。
API access」というグループがデフォルトで存在していると思いますので、
APIアクセスを許可したいユーザを「API Access」グループに追加します。
これでこのユーザはAPIアクセスを実施することができます。

あとは、curlコマンドを叩いてみます。
以下の例では、下記情報を利用します。

APIアクセスを許可したユーザ:apiuser
パスワード:apipassword
Zabbix ServerのIPアドレス:192.168.xx.yy


まずは認証処理です。

# curl -d '{"auth":null,"method":"user.authenticate","id":1,"params":{"password":"apipassword","user":"apiuser"},"jsonrpc":"2.0"}' -H "Content-Type: application/json-rpc" http://192.168.xx.yy/zabbix/api_jsonrpc.php
{"jsonrpc":"2.0","result":"3xafab71afaerx6cd1yy94b991334a20f","id":1}

これで認証が通りました。
以降はauthに上記結果の戻り値であるauthentication tokenを利用することでAPIの利用ができます。

ホストの情報を取る場合は以下のように実施。authは自身の認証情報を利用してください。

# curl -d '{"auth":"3xafab71afaerx6cd1yy94b991334a20f","method":"host.get","id":1,"params":{"hostids":["10047","10052"],"extendoutput":"true"},"jsonrpc":"2.0"}' -H "Content-Type: application/json-rpc" ht
tp://192.168.xx.yy/zabbix/api_jsonrpc.php
{"jsonrpc":"2.0",
"result":[
{"maintenances":[{"maintenanceid":"0"}],"hostid":"10047","proxy_hostid":"0","host":"test02","dns":"test02","useip":"1","ip":"192.168.xx.zz","port":"10050","status":"0","disable_until":"0","error":"","available":"1","errors_from":"0","lastaccess":"0","inbytes":"0","outbytes":"0","useipmi":"0","ipmi_port":"623","ipmi_authtype":"-1","ipmi_privilege":"2","ipmi_username":"","ipmi_password":"","ipmi_disable_until":"0","ipmi_available":"0","snmp_disable_until":"0","snmp_available":"1","maintenanceid":"0","maintenance_status":"0","maintenance_type":"0","maintenance_from":"0","ipmi_ip":"","ipmi_errors_from":"0","snmp_errors_from":"0","ipmi_error":"","snmp_error":""},
{"maintenances":[{"maintenanceid":"0"}],"hostid":"10052","proxy_hostid":"0","host":"test01","dns":"test01","useip":"1","ip":"192.168.xx.vv","port":"10050","status":"0","disable_until":"0","error":"","available":"1","errors_from":"0","lastaccess":"0","inbytes":"0","outbytes":"0","useipmi":"0","ipmi_port":"623","ipmi_authtype":"-1","ipmi_privilege":"2","ipmi_username":"","ipmi_password":"","ipmi_disable_until":"0","ipmi_available":"0","snmp_disable_until":"0","snmp_available":"1","maintenanceid":"0","maintenance_status":"0","maintenance_type":"0","maintenance_from":"0","ipmi_ip":"","ipmi_errors_from":"0","snmp_errors_from":"0","ipmi_error":"","snmp_error":""}],
"id":1}

こんな感じでhostidが10047と10052のホストの設定情報が取れてきます。
paramsにhostidsを指定しなかった場合は全ホストの情報が取れてきます。
取得数を制限したければ"limit":10といった具合に制限をかけて取得することも可能です。

ここまでできれば後は公式のサイトを見ていけば何でも取れそうです。
http://www.zabbix.com/documentation/1.8/api/

ちなみに最初いろいろうまくいきませんでした。

curlコマンドがうまくいかない場合こんな感じでエラーコードが返ってきます。

{"jsonrpc":"2.0","error":{"code":-32700,"message":"Parse error","data":"Invalid JSON. An error occurred on the server while parsing the JSON text."},"id":null}

これはどうも書き方がまずいのかうまくいかないケース。
"とか'とか}とか足りなかったり、変だった場合はこのエラーが出力されます。

また、認証に失敗した場合はこんな感じ。

{"jsonrpc":"2.0","error":{"code":-32602,"message":"Invalid params.","data":"Login name or password is incorrect"},"id":1}

認証は通るが、APIアクセス権限がなかった場合はこんな感じ。

{"jsonrpc":"2.0","error":{"code":-32602,"message":"Invalid params.","data":"No API access"},"id":1}

という具合にエラーメッセージから何がまずいかを判断できます。