使用 Zabbix API 最快获取警报信息! 并走向自动化

你好。
我是Mandai,负责Wild 开发团队。
这次我想写写Zabbix的API。
这或许有些突然,但你觉得API很麻烦吗?
说实话,我的感觉正好相反;我觉得API更容易上手。Zabbix
管理界面包含很多信息,所以如果你像我一样经常使用它,经常会忘记各项功能的位置。
警报信息会显示在仪表盘上,所以不用担心,但我仍然觉得使用 API 会更快!所以我研究了从 API 获取警报信息的最快方法。
API执行环境
为了执行 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 指定为方法,并将必要的信息作为参数即可。
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 是用户可以指定的任意整数,用于标识响应。
但是请注意,如果 id 为空、非整数值或不存在,则 API 返回值将无法正确接收。
概括
您可以通过 Zabbix API 添加或更改监控器,因此大多数操作都可以通过 API 完成。
此外,虽然它们不直接执行 API,但也开发了插件,允许您从 ansible 或 terraform 注册主机(该软件使用 API 来反映设置),因此可以创建一个环境,您可以在其中自动化从构建到监控的一切操作。
您可以定期从 AWS Lambda 或 Cloud Functions 运行它,或者定期从 cron 运行它,这是自动执行定期主机健康检查和更改设置的绝佳方法。
最新版本的 Zabbix API 文档在这里,但它只有英文版本,而且似乎不太友好,所以你一开始可能需要反复尝试。
在这种情况下,更稳妥的做法是搭建一个测试用的 Zabbix 服务器,并检查它是否运行正常。
就是这样。
2