You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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获取问题

如果脚本是独立运行、轮询抓取问题的,按以下步骤关联主机:

  1. 获取未解决的问题:优先取最新触发的问题,拿到对应的triggerid
  2. 通过触发器ID关联主机信息:触发器和主机绑定,直接通过trigger.get关联查询主机字段
  3. 提取目标主机数据

示例代码:

# 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 18:05:17