Python 3.x Zabbix API 3.4-由于循环要求,无法创建主机

Python 3.x Zabbix API 3.4-由于循环要求,无法创建主机,python-3.x,zabbix,Python 3.x,Zabbix,我正在尝试为用Python编写的服务添加zabbix服务器支持。此服务应在活动模式下向zabbix服务器发送度量。例如,服务定期连接到服务器,而不是以其他方式连接。(该服务可在防火墙后运行,唯一选项是使用活动模式。) 在host.create API调用中,我需要给出主机的接口。以下是相关文档:-需要interfaces参数。如果我试图给出一个空列表: zapi = ZabbixAPI(cfg.url) zapi.login(cfg.user, cfg.password) # I'm using

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

在host.create API调用中,我需要给出主机的接口。以下是相关文档:-需要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参数。 请参见此处:-我必须提供一个hostid

这是catch 22-为了创建主机,我需要一个主机接口。但是要创建主机接口,我需要一个主机


我错过了什么?也许我错了,host.create API调用被拒绝是因为另一个原因。我怎样才能知道它是什么?

主机创建api也将创建hostinterface,您需要根据

例如,在调用api之前添加以下内容:

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

然后将其传递给主机create api(创建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"}],  
)

在您的情况下是“主动主机”,但在Zabbix中,主动/被动的概念是针对项目,而不是针对主机。因此,主机可能同时具有被动和主动ITEN。

好的。现在我想知道,对于一个永远不会使用任何接口的主机,我应该提供什么样的接口。(例如,只在活动模式下更新项目的主机。)我可以给出一个已知的黑洞IP地址,但这不是最理想的解决方案。是的,这非常令人困惑。zabbix数据库的规范化显然存在问题。这是可行的,但有时会违反直觉。