zabbixのAPIを使ってホスト一覧を取得する。

ZabbixのAPIを使って監視対象のホスト一覧を取得してみました。

環境

Zabbixサーバー

ホスト名 example.com
zabbixバージョン Zabbix Server 2.0.7



Zabbixクライアント

ホスト名 test01.example.com
zabbixバージョン Zabbix Agent 2.0.11


下準備

ZabbixサーバーでAPI専用ユーザ

ユーザ名 zabbixapi
パスワード *****

を作っておきます。

認証トークンを取得
curl -X GET -H "Content-Type:application/json-rpc" -d '{"auth":null, "method":"user.login", "id":1, "params":{"user":"zabbixapi", "password":"*****"}, "jsonrpc":"2.0"}' http://example.com/zabbix/api_jsonrpc.php

↓こんな感じでトークンが発行されます。

{"jsonrpc":"2.0","result":"f7v1e46b24ee2aadcsf47v7bb66cf1d1","id":1}



ホスト一覧を取得

上記で取得したトークンを使ってホスト一覧を取得します。

curl -X GET -H "Content-Type:application/json-rpc" -d '{"auth":"f7v1e46b24ee2aadcsf47v7bb66cf1d1", "method":"host.get", "id":1, "params":{"output":"extend"}, "jsonrpc":"2.0"}' http://example.com/zabbix/api_jsonrpc.php | jq '.'

jqコマンドを使って見やすく表示させています。


結果

    {
      "name": "test01",
      "jmx_error": "",
      "jmx_errors_from": "0",
      "jmx_available": "0",
      "jmx_disable_until": "0",
      "snmp_error": "",
      "ipmi_error": "",
      "snmp_errors_from": "0",
      "ipmi_errors_from": "0",
      "maintenance_from": "0",
      "maintenance_type": "0",
      "maintenance_status": "0",
      "maintenanceid": "0",
      "snmp_available": "0",
      "snmp_disable_until": "0",
      "available": "1",
      "error": "",
      "disable_until": "0",
      "status": "0",
      "host": "test01",
      "proxy_hostid": "0",
      "hostid": "10001",
      "maintenances": [],
      "errors_from": "0",
      "lastaccess": "0",
      "ipmi_authtype": "-1",
      "ipmi_privilege": "2",
      "ipmi_username": "",
      "ipmi_password": "",
      "ipmi_disable_until": "0",
      "ipmi_available": "0"
    },

こんな感じで取得されます。


が、DNS名やIPアドレス項目が表示されていません。。。。
ホスト一覧はZabbixサーバーに登録してあるホスト名ではなく、
「Zabbixエージェントのインターフェースの設定」で入力しているdns項目の一覧を取得したかったのです。


f:id:tsunokawa:20140418173454p:plain
↑この部分ですね。


Zabbixの公式ドキュメントを見たりと調べてみて分かったのですがどうもZabbixのバージョン2.0からAPIの仕様が変わったようです。
1.8系だとDNS名やIPアドレスの項目が表示されるのですが、2.0からはparamsにselectInterfacesというパラメータを追加してやる必要があるようです。


selectInterfacesを追加してもう一度ホスト一覧取得をやってみました。

curl -X GET -H "Content-Type:application/json-rpc" -d '{"auth":"f7v1e46b24ee2aadcsf47v7bb66cf1d1", "method":"host.get", "id":1, "params":{"output":"extend", "selectInterfaces":"extend"}, "jsonrpc":"2.0"}' http://example.com/zabbix/api_jsonrpc.php | jq '.'


結果

    {
      "name": "test01",
      "jmx_error": "",
      "jmx_errors_from": "0",
      "jmx_available": "0",
      "jmx_disable_until": "0",
      "snmp_error": "",
      "ipmi_error": "",
      "snmp_errors_from": "0",
      "ipmi_errors_from": "0",
      "maintenance_from": "0",
      "maintenance_type": "0",
      "maintenance_status": "0",
      "maintenanceid": "0",
      "snmp_available": "0",
      "snmp_disable_until": "0",
      "ipmi_available": "0",
      "error": "",
      "disable_until": "0",
      "status": "0",
      "host": "test01",
      "proxy_hostid": "0",
      "hostid": "11293",
      "maintenances": [],
      "interfaces": {
        "33089": {
          "port": "10050",
          "dns": "test01.example.com",
          "ip": "10.0.0.1",
          "useip": "1",
          "type": "1",
          "main": "1",
          "hostid": "10001",
          "interfaceid": "33089"
        }
      },
      "available": "1",
      "errors_from": "0",
      "lastaccess": "0",
      "ipmi_authtype": "-1",
      "ipmi_privilege": "2",
      "ipmi_username": "",
      "ipmi_password": "",
      "ipmi_disable_until": "0"
    },


今度はちゃんとtest01.example.comや10.0.0.1といったDNS名とIPアドレスなどインターフェース設定の項目が表示されるようになりました。

監視ステータスが有効のもののみ表示

paramsに"monitored_hosts":"True"を追加することで可能でした。

curl -X GET -H "Content-Type:application/json-rpc" -d '{"auth":"f7v1e46b24ee2aadcsf47v7bb66cf1d1", "method":"host.get", "id":1, "params":{"output":"extend", "selectInterfaces":"extend", "monitored_hosts":"True"}, "jsonrpc":"2.0"}' http://example.com/zabbix/api_jsonrpc.php | jq '.'