Zabbixでapiを使用して登録済のホスト全台分のIPを一括して取得


「zabbixに登録されている一部のホストに対して、●●を一括して実行する」といった作業がわりと多く、今後も使う機会がありそうなため、履歴として残します。
※zabbixのapi機能の詳細を把握したい場合は、他の方の記事を参考にしたほうがわかりやすいと思います。

## 認証トークンを取得
```ruby:
[root@localhost ~]# curl -X GET -H "Content-Type:application/json-rpc" -d '{"auth":null, "method":"user.login", "id":1, "params":{"user":"Admin", "password":"zabbix"}, "jsonrpc":"2.0"}' http://192.168.10.5/zabbix/api_jsonrpc.php
{"jsonrpc":"2.0","result":"c852c68b72e789d1c56d249cc377a1ce","id":1
```

* 認証トークン「c852c68b72e789d1c56d249cc377a1ce」が取得できたので、こちらを使用してapiで登録済みホスト全台のIPを取得します。
* 上記コマンド実行の際には自環境の設定値に合わせて実行する必要があります。
  * user：zabbix_serverログイン時に使用するID
  * password：zabbix_serverログイン時に使用するPW
  * URL：http://${zabbix_serverのIP}/zabbix/api_jsonrpc.php



##zabbix apiを使用して登録済ホスト全台分のインターフェイス情報を取得

```ruby:
[root@localhost ~]# curl -X GET -H "Content-Type:application/json-rpc" -d '{"auth":"5245fa2382467aeaf24c2ad4497bde20", "method":"hostinterface.get", "id":1, "params":{"output":"extend"}, "jsonrpc":"2.0"}' http://192.168.10.5/zabbix/api_jsonrpc.php | jq '.'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   938    0   810  100   128   8023   1267 --:--:-- --:--:-- --:--:--  8100
{
  "jsonrpc": "2.0",
  "result": [
    {
      "interfaceid": "2",
      "hostid": "10330",
      "main": "1",
      "type": "1",
      "useip": "1",
      "ip": "192.168.100.1",
      "dns": "",
      "port": "10050",
      "details": []
    },
    {
      "interfaceid": "3",
      "hostid": "10331",
      "main": "1",
      "type": "1",
      "useip": "1",
      "ip": "192.168.100.2",
      "dns": "",
      "port": "10050",
      "details": []
    },
※以下長いので省略
```

登録済ホストのインターフェイス情報が出力できました。
※"method":"hostinterface.get"でインターフェイス情報を取得することができます

また、上記出力をIPのみに絞って取得し、見やすくします。

```ruby:ipのみ取得
[root@localhost ~]# curl -X GET -H "Content-Type:application/json-rpc" -d '{"auth":"5245fa2382467aeaf24c2ad4497bde20", "method":"hostinterface.get", "id":1, "params":{"output":"extend"}, "jsonrpc":"2.0"}' http://192.168.10.5/zabbix/api_jsonrpc.php | jq '.' |grep ip |grep -v "useip" |awk -F " " '{print $2}' |tr -d \" |tr -d ","
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   938    0   810  100   128   8387   1325 --:--:-- --:--:-- --:--:--  8437
192.168.100.1
192.168.100.2
192.168.100.3
192.168.100.4
192.168.100.5
```
出力結果をIPのみに絞って出力することができました。

#####※ここから少し追加しました
上記のように無理やり出力結果を成形せずとも、適切なパラメータを与えてあげることで、
ある程度整理された状態で出力することができるようでした。

* 修正前："method":"hostinterface.get", "id":1, "params":{"output":"extend"}
* 修正後："method":"hostinterface.get", "id":1, "params":{"output":"[ip]"}<br>
※「"output":"extend"」と指定すると紐づく全ての値が出力されてしまうため、今回欲しいIPアドレスだけの情報に限定して出力します

```ruby:修正後
[root@localhost ~]# curl -X GET -H "Content-Type:application/json-rpc" -d '{"auth":"5245fa2382467aeaf24c2ad4497bde20", "method":"hostinterface.get", "id":1, "params":{"output":["ip"]}, "jsonrpc":"2.0"}' http://192.168.10.5/zabbix/api_jsonrpc.php | jq '.'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   532    0   406  100   126   7399   2296 --:--:-- --:--:-- --:--:--  7518
{
  "jsonrpc": "2.0",
  "result": [
    {
      "interfaceid": "1",
      "ip": "192.168.100.1"
    },
    {
      "interfaceid": "2",
      "ip": "192.168.100.2"
    },
  ],
※省略
```
上記のような結果から出力情報を整えてあげたほうが効率が良いようでした。
また、こちらを応用して各ホストに紐づくトリガーの設定値についても一覧で取得することが可能なようでしたので参考までに。

```ruby:ホスト毎のトリガー設定値を取得
[root@localhost ~]# curl -X GET -H "Content-Type:application/json-rpc" -d '{"auth":"5245fa2382467aeaf24c2ad4497bde20", "method":"host.get", "id":1, "params":{"output":["host"], "selectTriggers":["description"]}, "jsonrpc":"2.0"}' http://192.168.10.5/zabbix/api_jsonrpc.php | jq '.' |egrep "\"host\"|description"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 21016    0 20863  100   153   288k   2163 --:--:-- --:--:-- --:--:--  291k
      "host": "zbx_3.0_host",
          "description": "Host name of zabbix_agentd was changed on {HOST.NAME}"
          "description": "HTTP service is down on {HOST.NAME}"
          "description": "IMAP service is down on {HOST.NAME}"
          "description": "POP service is down on {HOST.NAME}"
          "description": "SMTP service is down on {HOST.NAME}"
          "description": "SSH service is down on {HOST.NAME}"
          "description": "NTP service is down on {HOST.NAME}"
          "description": "Processor load is too high on {HOST.NAME}"
          "description": "Disk I/O is overloaded on {HOST.NAME}"
          "description": "Hostname was changed on {HOST.NAME}"
          "description": "[TCP Session] To many TCP sessions on {HOSTNAME}"
          "description": "{HOST.NAME} has just been restarted"
          "description": "/etc/passwd has been changed on {HOST.NAME}"
      "host": "zbx_5.0_host",
          "description": "Host name of zabbix_agentd was changed on {HOST.NAME}"
          "description": "Hostname was changed on {HOST.NAME}"
          "description": "[TCP Session] To many TCP sessions on {HOSTNAME}"
          "description": "{HOST.NAME} has just been restarted"
          "description": "/etc/passwd has been changed on {HOST.NAME}"
      "host": "zbx_5.1_host",
      "host": "zbx_5.2_host",
※省略
```
「zbx_3.0_host」に設定されていて「zbx_5.0_host」には設定されていないトリガーなど、運用にあたってはよく見かける光景かと思います。
※「zbx_5.1_host」や「zbx_5.2_host」はトリガー未設定のためホスト名のみ出力されています

こちらの内容を両環境でテキストなどに出力しdiffで差分をとれば、どの設定値に差分があるのかより分かりやすくなると思います。

zabbixは業務以外ではあまり触れる機会がありませんが、API含めまだまだ理解できていない部分がたくさんあるため、気づいたことがあればまた載せていきたいと思います。

##補足事項
「method」の値を変更することでより様々な情報を取得することができます。

zabbix公式ドキュメント
https://www.zabbix.com/documentation/current/manual/api/reference