Zabbix API 3.4 - невозможно создать хост из-за циклического требования - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь добавить поддержку zabbix сервера для сервиса, написанного на Python. Эта служба должна отправлять метрики на zabbix сервер в активном режиме. Например. служба подключается к серверу периодически, а не другим способом. (Служба может работать за брандмауэрами, единственный вариант - использовать активный режим.)

В вызове API host.create я должен указать интерфейсы для хоста. Вот документация для этого: https://www.zabbix.com/documentation/3.4/manual/api/reference/host/create - обязательный параметр interfaces. Если я попытаюсь дать пустой список:

zapi = ZabbixAPI(cfg.url)
zapi.login(cfg.user, cfg.password) # I'm using an administrator user here!
host = zapi.host.create(
    host=cfg.host_name,
    description=cfg.host_description,
    inventory_mode=1,  # auto host inventory population
    status=0,  # monitored host
    groups=[host_group_id],
    interfaces=[],  # active agent, no interface???
)

Тогда я получаю эту ошибку:

pyzabbix.ZabbixAPIException: ('Error -32500: Application error., No permissions to referred object or it does not exist!', -32500)

Я могу создавать хосты, используя одного и того же пользователя и веб-интерфейс zabbix, так что я думаю, проблема в интерфейсах. Поэтому я попытался сначала создать интерфейс. Однако для метода hostinterface.create требуется параметр hostid. Смотрите здесь: https://www.zabbix.com/documentation/3.4/manual/api/reference/hostinterface/create - я должен дать хостид.

Это уловка 22 - Для создания хоста мне нужен интерфейс хоста. Но для создания интерфейса хоста мне нужен хост.

Что мне не хватает? Возможно, я ошибся, и вызов API host.create был отклонен по другой причине. Как я могу понять, что это было?

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Ссылочная документация не показывает простоту, но в Zabbix один хост должен иметь: - Один или несколько интерфейсов (активные хосты тоже нужны) - Одна или несколько групп хостов

Так что для работы вашего кода вам нужно перейти на что-то вроде этого:

zapi = ZabbixAPI(cfg.url)
zapi.login(cfg.user, cfg.password) # I'm using an administrator user here!
host = zapi.host.create(
    host=cfg.host_name,
    description=cfg.host_description,
    inventory_mode=1,  # auto host inventory population
    status=0,  # monitored host
    groups=[host_group_id],
    interfaces=[ {"type": "1",
             "main": "1",
             "useip": "1", 
             "ip": "127.0.0.1",
             "dns": "mydns", # can be blank
             "port": "10051"}],  
)

В вашем случае это «активный хост», но в Zabbix концепция Active / Passive предназначена для элементов, а не для хостов. Поэтому возможно (и не очень необычно) иметь хосты с пассивными и активными itens одновременно.

0 голосов
/ 02 сентября 2018

Host create api также создаст hostinterface, вам нужно заполнить интерфейсы [] правильными полями согласно документации

Например, добавьте это перед вызовом API:

interfaces = []
interfaces.append( {
  'type' : 2,
  'main' : 1,
  'useip': 1,
  'ip' : '1.2.3.4',
  'dns' : "",
  'port' : '161'
} )

затем передайте его хосту create api

...