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

你好。
我是Mandai,负责Wild 开发团队。

这次我想写写Zabbix的API。

这或许有些突然,但你觉得API很麻烦吗?

说实话,我的感觉正好相反;我觉得API更容易上手。Zabbix
管理界面包含很多信息,所以如果你像我一样经常使用它,经常会忘记各项功能的位置。

警报信息会显示在仪表盘上,所以不用担心,但我仍然觉得使用 API 会更快!所以我研究了从 API 获取警报信息的最快方法。

API执行环境

为了执行 API,我们使用了名为 Postman 的软件。
它最初是作为 Chrome 和 Firefox 的扩展程序发布的,但现在也发布了独立版本,所以我们将使用独立版本。

Postman | API 开发环境

试用版足以满足本文所述内容的需求。
它也方便 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:

  1. 使用 user.login API 获取登录令牌
  2. 使用 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
加载中...
2 票,平均:1.00 / 12
12,609
X Facebook 哈特纳书签 口袋

写这篇文章的人

关于作者

万代洋一

我的主要工作是为社交游戏开发 Web API,但我也很幸运能够做很多其他工作,包括营销。
此外,我在 Beyond 中的肖像权被视为 CC0。