如何通过Zabbix API的zapi.item.get获取同主机监控数据并格式化输出
解决Zabbix API获取监控数据并生成指定表格的问题
核心实现步骤
要拿到你需要的主机监控数据并生成表格,需要通过Zabbix API完成三个核心操作:
- 认证获取会话令牌
- 拉取主机基础信息(名称、IP地址)
- 查询对应主机的
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
相关产品推荐
相关产品推荐

