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

如何通过Zabbix API的zapi.item.get获取同主机监控数据并格式化输出

解决Zabbix API获取监控数据并生成指定表格的问题

核心实现步骤

要拿到你需要的主机监控数据并生成表格,需要通过Zabbix API完成三个核心操作:

  1. 认证获取会话令牌
  2. 拉取主机基础信息(名称、IP地址)
  3. 查询对应主机的icmpping(响应时间)、icmploss(丢包率)监控项数据,同时获取主机状态

完整Python代码示例

以下代码可直接适配需求,你只需替换成自己的Zabbix环境配置:

import requests
import json

# Zabbix API配置信息
ZABBIX_API_URL = "http://你的Zabbix服务器地址/api_jsonrpc.php"
ZABBIX_USER = "Admin"
ZABBIX_PASSWORD = "zabbix"

# 登录获取认证令牌
def get_auth_token():
    payload = {
        "jsonrpc": "2.0",
        "method": "user.login",
        "params": {"user": ZABBIX_USER, "password": ZABBIX_PASSWORD},
        "id": 1
    }
    resp = requests.post(ZABBIX_API_URL, json=payload)
    return resp.json()["result"]

# 获取主机列表及对应IP
def fetch_hosts(auth_token):
    payload = {
        "jsonrpc": "2.0",
        "method": "host.get",
        "params": {
            "output": ["hostid", "name"],
            "selectInterfaces": ["ip"]
        },
        "id": 2,
        "auth": auth_token
    }
    resp = requests.post(ZABBIX_API_URL, json=payload)
    host_list = []
    for host in resp.json()["result"]:
        host_list.append({
            "hostid": host["hostid"],
            "hostname": host["name"],
            "ip": host["interfaces"][0]["ip"]
        })
    return host_list

# 获取指定监控项的最新值
def get_item_last_value(auth_token, host_id, item_key):
    payload = {
        "jsonrpc": "2.0",
        "method": "item.get",
        "params": {
            "output": ["lastvalue"],
            "hostids": host_id,
            "search": {"key_": item_key}
        },
        "id": 3,
        "auth": auth_token
    }
    resp = requests.post(ZABBIX_API_URL, json=payload)
    result = resp.json()["result"]
    return result[0]["lastvalue"] if result else "N/A"

# 获取主机状态(up/down)
def get_host_status(auth_token, host_id):
    payload = {
        "jsonrpc": "2.0",
        "method": "host.get",
        "params": {
            "output": ["status"],
            "hostids": host_id
        },
        "id": 4,
        "auth": auth_token
    }
    resp = requests.post(ZABBIX_API_URL, json=payload)
    status_code = resp.json()["result"][0]["status"]
    return "up" if status_code == "0" else "down"

# 生成Markdown格式表格
def build_markdown_table(host_data):
    header = "| hostname | ip | ping | loss | status |\n|----------|----|------|------|--------|"
    rows = []
    for data in host_data:
        row = f"| {data['hostname']} | {data['ip']} | {data['ping']}ms | {data['loss']}% | {data['status']} |"
        rows.append(row)
    return "\n".join([header] + rows)

if __name__ == "__main__":
    try:
        token = get_auth_token()
        hosts = fetch_hosts(token)
        host_monitor_data = []
        
        for host in hosts:
            ping = get_item_last_value(token, host["hostid"], "icmpping")
            loss = get_item_last_value(token, host["hostid"], "icmploss")
            status = get_host_status(token, host["hostid"])
            
            host_monitor_data.append({
                "hostname": host["hostname"],
                "ip": host["ip"],
                "ping": ping,
                "loss": loss,
                "status": status
            })
        
        # 输出最终表格
        print(build_markdown_table(host_monitor_data))
    except Exception as e:
        print(f"执行出错:{str(e)}")

关键注意事项

  • 替换代码中的ZABBIX_API_URL、ZABBIX_USER、ZABBIX_PASSWORD为你的实际Zabbix配置
  • 如果你的Zabbix环境中自定义了icmpping/icmploss的监控项键名,需要修改get_item_last_value函数中的item_key参数
  • 代码输出的是标准Markdown表格,你可以直接使用,或者自行转换为需要的HTML格式

示例输出

| hostname | ip | ping | loss | status |
|----------|----|------|------|--------|
| test.server.1 | 1.1.1.1 | 0 | 0 | up |
| test.server.2 | 8.8.8.8 | 1 | 33 | up |

内容的提问来源于stack exchange,提问作者Samuka Sampaio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:36:22