如何通过Zabbix API获取触发问题的主机信息
解决Zabbix API精准获取问题主机的方法
核心思路
你之前的代码随机返回主机,是因为没有基于问题事件关联的触发器/主机ID做过滤。要精准定位出问题的主机,必须从触发问题的事件或触发器入手,关联到对应的hostid后再查询主机信息。
两种场景的解决方案
场景1:脚本作为Zabbix动作触发执行(推荐)
如果你的脚本是Zabbix在触发器触发时通过「动作」调用的,Zabbix会自动传递相关宏变量,直接用宏变量就能拿到目标主机ID:
- 在Zabbix动作的「操作」中,给脚本传递参数
{HOST.ID}(主机ID)或{HOST.NAME}(主机名) - 脚本中读取参数,直接用该ID查询主机:
import sys host_id = sys.argv[1] my_host = zabbix_log.host.get( hostids=host_id, output=["hostid", "name", "host"] )[0]
场景2:脚本主动轮询Zabbix API获取问题
如果脚本是独立运行、轮询抓取问题的,按以下步骤关联主机:
- 获取未解决的问题:优先取最新触发的问题,拿到对应的
triggerid - 通过触发器ID关联主机信息:触发器和主机绑定,直接通过
trigger.get关联查询主机字段 - 提取目标主机数据
示例代码:
# 1. 获取最新未解决的问题 problems = zabbix_log.problem.get( output=["eventid", "triggerid"], sortfield="clock", sortorder="DESC", # 按时间倒序,取最新触发的问题 limit=1, filter={"state": 0} # 0代表未解决的问题 ) if problems: trigger_id = problems[0]["triggerid"] # 2. 获取触发器关联的主机(直接返回主机信息,无需额外查询) triggers = zabbix_log.trigger.get( triggerids=trigger_id, selectHosts=["hostid", "name", "host"] # 直接关联查询主机字段 ) if triggers and triggers[0]["hosts"]: # 3. 提取目标主机 my_host = triggers[0]["hosts"][0] print(f"问题主机信息:{my_host}")
关键注意事项
- 确保Zabbix API用户拥有问题、触发器、主机的读取权限
- 若触发器属于模板,
selectHosts仍能正确返回关联的监控主机 - 处理批量问题时,去掉
limit=1,遍历所有未解决问题逐个处理
内容的提问来源于stack exchange,提问作者ekaterinochkus
相关产品推荐
相关产品推荐

