Help us understand the problem. What is going on with this article?

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) ネタができ次第、追記していく予定です。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away