Zabbix API 3.4 - 由于循环要求无法创建主机

Zabbix API 3.4 - unable to create host because of circular requirement

我正在尝试为 Python 中编写的服务添加 zabbix 服务器支持。此服务应以主动模式将指标发送到 zabbix 服务器。例如。该服务定期连接到服务器,而不是其他方式。 (该服务可以在防火墙后运行,唯一的选择是使用主动模式。)

在host.create API调用中,我需要提供主机接口。这是相关的文档: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 web 界面创建主机,所以我猜问题出在界面上。所以我尝试先创建一个界面。但是,hostinterface.create 方法需要一个 hostid 参数。 看这里:https://www.zabbix.com/documentation/3.4/manual/api/reference/hostinterface/create - 我必须给一个hostid。

这是陷阱 22 - 为了创建主机,我需要有一个主机界面。但是要创建主机接口,我需要有一个主机。

我错过了什么?也许我错了,host.create API 调用由于不同的原因被拒绝了。我怎样才能弄清楚它是什么?

主机创建 api 也会创建主机接口,您需要根据 the documentation

使用正确的字段填充接口 []

例如,在调用 api 之前添加:

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

然后传给host create api

参考文档没有明确显示,但在 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"}],  
)

在你的例子中是 "active host" 但在 Zabbix 中 Active/Passive 的概念是针对项目的,而不是针对主机的。所以它可能(并且不是很不寻常)同时具有被动和主动 itens 的主机。