Python
zabbix

Zabbix API(参照系)の逆引きメモ

More than 1 year has passed since last update.

しばらく前から運用系の業務に従事することになり、そこで監視システムとして使われていたZabbixとお近づきになる生活が始まりました。

Zabbixをもうちょい乗りこなして賢く使いたいので、自分の試してみた範囲でAPIの叩き方を逆引きメモとして残したいと思います。

なお、私は運用の作業者ロールでZabbixを利用しています。テンプレートの設定とか、監視設定の構築に関わる部分の話はできません。
「こんな設定内容見たいけど、どうすればいいの?」というニーズにはマッチするところがあるかなと思います。
※一部コピペで書いてない部分があります。動かないスニペットがあったらすいません。

使用環境

  • Mac OS X / El Capitan
  • Python 3.6
  • Zabbix 2.2

ZabbixのAPIを生で叩くのは工数もかかって率が悪いので、ここではZabbix APIのラッパーとしてpy-zabbixを利用します。

必要に応じてdatetimeとかjsonとかyamlとか、他のモジュールも利用します。


登録ホスト名からIP/DNS name/Portを引く

host.getを使います。 "selectInterfaces" のパラメータを出力させるように引数を与え、そこからIPやポートの情報を参照します。

Interfaceの詳細はこの辺を御覧ください。

Zabbix Documentation 2.2: Host interface object

typeuseip が割と重要かと思います。 useip は "0"ならDNS name、 "1"ならIPを使っている、ということになります。

# Zabbix API オブジェクトの生成(以降ここは省略)
import pyzabbix
zapi = pyzabbix.ZabbixAPI(url='https://localhost/zabbix/', user='admin', password='zabbix')

# host.get
## ホスト名完全一致で引くなら以下
param = dict(
    output = "extend",
    selectInterfaces = "extend",
    filter = {
        "name": hostnames  # 複数対象でも検索は可能。 str or list
    }
)
## ホスト名部分一致で引くなら以下
param = dict(
    output = "extend",
    selectInterfaces = "extend",
    search = {
        "name": hostnames  # str or list
    }
)

ret = zapi.host.get(**param)

# 一致したホスト名を列挙
hostnames = [ host["name"] for host in ret ]

# インタフェースの参照
hostname = ret[0]["name"]
interfaces = ret[0]["interfaces"]

## DNSを登録しているインタフェース
use_dns = [ i for i in interfaces if i["useip"]=="0" ]
for i in use_dns:
    print("{} {}:{}".format(hostname, i["dns"], i["port"]))

## IPを登録しているインタフェース
use_ip = [ i for i in interfaces if i["useip"]=="1" ]
for i in use_ip:
    print("{} {}:{}".format(hostname, i["ip"], i["port"]))

# タイプが「エージェント」になっているインタフェース
ip_or_dns = lambda intf: intf["ip"] if intf["useip"]=="1" else intf["dns"]
agent_interfaces = [ i for i in interfaces if i["type"]=="1" ]
for i in agent_interfaces:
    print("{} {}:{}".format(hostname, ip_or_dns(i), i["port"]))

(2017.11.09) ネタができ次第、追記していく予定です。