Zabbix API 使您能够快速访问警报信息并实现工作流程自动化。

大家好,
我是Mandai,Wild团队负责开发工作的成员。
这次我想写写Zabbix的API。
这或许有些突然,但你觉得API很麻烦吗?
说实话,我的感觉恰恰相反;API 用起来要方便得多。Zabbix
管理界面信息太多,以我的使用频率,经常会忘记各项功能在哪里。
警报信息会显示在仪表盘上,所以不用担心,但我仍然觉得使用 API 会更快!所以我研究了从 API 获取警报信息的最快方法。
API执行环境
在这个项目中,我使用 Postman 来执行 API。Postman
最初是以 Chrome 或 Firefox 扩展程序的形式发布的,但现在也有独立版本,所以我将使用独立版本。
试用版足以满足本文内容的实现需求。
它也方便 API 开发,如果您喜欢,可以考虑升级到付费套餐。
它尤其适用于团队开发,因为它支持 URL 共享!
检查 Zabbix API 版本
我们先从最简单的 API 开始。Zabbix
只提供一个 API 端点,因此所有 API 都通过以下 URL 访问。
http[s]://[您的域名]/api_jsonrpc.php
由于还需要发送登录账号信息等信息,因此必须使用 POST 方式发送。
内容类型为 application/json-rpc。
首先,我们来了解一下 Zabbix 的相关信息。
// 请求体 { "jsonrpc": "2.0", "method": "apiinfo.version", "id": 1, "auth": null, "params": {} } // 响应 { "jsonrpc": "2.0", "result": "3.4.14", "id": 1 }
如果返回的版本号符合此要求,则表示请求已正确发出。
如果发生错误,请检查下面的 HTTP 请求信息,看看哪里出了问题。
POST /api_jsonrpc.php HTTP/1.1 Host: [您的域名] Content-Type: application/json-rpc {"jsonrpc":"2.0","method":"apiinfo.version","id":1,"auth":null,"params":{}}
将请求 JSON 作为原始数据存储在请求体中似乎可以正常工作。
否则,可能是 URL 不一致导致的,请检查 URL 是否正确。
具体步骤如下:
- 通过浏览器登录 Zabbix 管理页面。
- 检查首页的 URL(在本例中,它是 https://[您的域名]/zabbix.php?action=dashboard.view)
- api_jsonrpc.php 与 zabbix.php 位于同一目录下,因此请将 zabbix.php?action=dashboard.view 替换为 api_jsonrpc.php。
这样应该就能得到正确的API URL了。
登录
// 请求体 { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "用户名"", "password": "密码" }, "id": 1, "auth": null } // 响应 { "jsonrpc": "2.0", "result": "32 位哈希值"", "id": 1 }
通过将响应中获得的哈希值作为令牌输入到每个请求的 auth 密钥中,您可以获取详细信息。
获取主机信息
获取主机列表非常简单。
只需将方法指定为 `host.get`,并将必要信息作为 `params` 参数传递即可。
Zabbix 从服务器检索大量数据,因此可能更难记住参数。
// 请求体 { "jsonrpc": "2.0", "method": "host.get", "params": { "output": [ "hostid", "host" ], "selectInterfaces": [ "interfaceid", "ip" ] }, "id": 2, "auth": "[32 位哈希值]" } // 响应 { "jsonrpc": "2.0", "result": [ { "hostid": "1", "host": "Zabbix 服务器", "interfaces": [ { "interfaceid": "1", "ip": "127.0.0.1" } ] }, ... ], "id": 2 }
除了需要将从 user.login API 获取的登录哈希值嵌入到身份验证部分之外,您应该可以通过简单的复制粘贴来检索该信息。请注意,
如果您监控大量服务器,将会收到海量的 JSON 数据。
如果项目数量很大,可以使用 limit 键来缩小数据项的数量范围。
获取提醒
现在,要了解警报的主要内容,几乎与获取主机信息相同。
// 请求 JSON // 获取最新的 3 条警报 { "jsonrpc": "2.0", "method": "alert.get", "params": { "output": "extend", "limit": "3", "sortfield": "alertid", "sortorder": "DESC" }, "auth": "xxxxxxxxxxxxxxxxxxxxxx", "id": 1 } // 响应 { "jsonrpc": "2.0", "result": [ { "alertid": "21496022", "actionid": "13", "eventid": "72481", "userid": "xxx", "clock": "1557795687", "mediatypeid": "7", "sendto": "...", "subject": "...", "message": "...", "status": "1", "retries": "0", "error": "", "esc_step": "1", "alerttype": "0", "p_eventid": " "xxxxx", "acknowledgeid": "0" }, { "alertid": "21496021", "actionid": "13", "eventid": "72481", "userid": "xxx", "clock": "1557795687", "mediatypeid": "1", "sendto": "...", "subject": "...", "message": "...", "status": "1", "retries": "0", "error": "", "esc_step": "1", "alerttype": "0", "p_eventid": "xxxxx", "acknowledgeid": "0" }, { "alertid": "21496020", "actionid": "11", "eventid": "72481", "userid": "xxx", "clock": "1557795687", "mediatypeid": "1", "sendto": "...", "subject": "...", "message": "...", "status": "1", "retries": "0", "error": "", "esc_step": "1", "alerttype": "0", "p_eventid": "xxxxx", "acknowledgeid": "0" } ], "id": 1 }
详细信息已被移除,但可检索的项目如上所述。
此 API 可用于在警报触发和解决时检索信息。
没有什么特别值得一提的亮点,但如果非要挑一个的话,那就是它会按 alertid 降序排列。
你可以使用 sortfield 指定要排序的数据,使用 sortorder 指定排序顺序。
排序方式必须指定为升序 (ASC) 或降序 (DESC),且必须使用大写字母。
这给我造成了一些麻烦。
结论
事实证明,要从 API 获取警报信息,需要执行两个 API:
- 使用 user.login API 获取登录令牌
- 使用 alert.get API 获取警报信息
如果你能轻松解析步骤 1 中的响应并提取令牌,你也可以执行步骤 2 中的 API,所以即使你不熟悉编程,创建起来也应该相当容易。
什么是ID?
`id` 是用户可以指定的任意整数,用于标识响应。
但是请注意,如果它为空、非整数值或不存在,您将无法正确接收 API 返回值。
概括
您可以通过 Zabbix API 添加或更改监控器,因此大多数操作都可以通过 API 完成。
此外,虽然它们不直接执行 API,但也开发了插件,允许您从 ansible 或 terraform 注册主机(该软件使用 API 来反映设置),因此可以创建一个环境,您可以在其中自动化从构建到监控的一切操作。
您可以定期从 AWS Lambda 或 Cloud Functions 运行它,或者定期从 cron 运行它,这是自动执行定期主机健康检查和更改设置的绝佳方法。
最新版本的 Zabbix API 文档在这里,但它只有英文版本,而且似乎不太友好,所以你一开始可能需要反复尝试。
在这种情况下,最好搭建一个测试用的 Zabbix 服务器并验证其是否正常工作。
就这样。
3
