使用 Zabbix API 最快获取警报信息! 并走向自动化
你好。
我是Mandai,负责Wild 开发团队。
这次想写一下Zabbix的API。
这可能有点出乎意料,但是您认为 API 很麻烦吗?
老实说,我恰恰相反;API 非常简单。
Zabbix的管理屏幕有很多信息,所以如果你像我一样经常使用它,你经常会忘记所有东西在哪里。
警报信息出现在仪表板上,因此很容易迷路,但 API 仍然会更快!因此,我们研究了从 API 获取警报信息的最快方法。
API执行环境
这次,我使用了一个名为Postman的软件来运行API。
它最初是作为 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”,“结果”:“3.4.14”,“id”:1}
如果版本像这样返回,则请求已正确发出。
如果出现错误,请检查下面的HTTP请求信息,看看是什么问题。
POST /api_jsonrpc.php HTTP/1.1 主机:[您的域] 内容类型:application/json-rpc {"jsonrpc":"2.0","method":"apiinfo.version","id":1,"auth ":null,"参数":{}}
如果请求 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 key 中,可以获得详细信息。
获取主机信息
获取主机列表非常容易。
只需将 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", "主机": "Zabbix 服务器", "接口": [ { "interfaceid": "1", "ip": "127.0.0.1" } ] }, ... ], "id": 2 }
我认为您可以通过复制和粘贴来获取信息,除非您需要在 auth 部分填写通过 user.login API 获取的登录哈希。
请注意,如果您监控大量服务器,您将收到大量 JSON 数据。
如果记录较多,可以使用限制键缩小记录数。
获取提醒
现在,主要问题是获取警报,这与获取主机信息几乎相同。
// 请求 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”,“时钟”:“1557795687”,“mediatypeid”:“7”,“sendto” “:“...”,“主题”:“...”,“消息”:“...”,“状态”:“1”,“重试”:“0”,“错误”:“” , "esc_step": "1", "alerttype": "0", "p_eventid": "xxxxx", "acknowledgeid": "0" }, { "alertid": "21496021", "actionid": "13" ,“eventid”:“72481”,“userid”:“xxx”,“时钟”:“1557795687”,“mediatypeid”:“1”,“sendto”:“...”,“主题”:“.. ."、"消息":"..."、"状态":"1"、"重试":"0"、"错误":""、"esc_step":"1"、"警报类型":"0 ", "p_eventid": "xxxxx", "acknowledgeid": "0" }, { "alertid": "21496020", "actionid": "11", "eventid": "72481", "userid" : "xxx ”、“时钟”:“1557795687”、“mediatypeid”:“1”、“sendto”:“...”、“主题”:“...”、“消息”:“...”、“状态” “:“1”,“重试”:“0”,“错误”:“”,“esc_step”:“1”,“alerttype”:“0”,“p_eventid”:“xxxxx”,“acknowledgeid”:“ 0" } ], "id": 1 }
虽然详细信息已被删除,但可以检索的项目已在上面列出。
您可以使用此 API 来获取警报发生时间和解决时间。
没有明显的点,但如果我不得不猜测,我会说它按降序对警报进行排序。
使用 sortfield 指定要排序的数据,使用 sortorder 指定排序顺序。
排序顺序必须指定为 ASC | DESC 并且必须为大写。
我对这个有点卡住了。
结论
事实证明,为了从 API 获取警报信息,我们需要运行两个 API。
- 使用 user.login API 获取登录令牌
- 使用alert.get API获取警报信息
如果您稍微解析步骤 1 中的响应并提取令牌,您还可以执行步骤 2 中的 API,因此即使那些不熟悉编程的人也应该能够相对轻松地创建它。
id是什么?
id 是用户可以指定用于标识响应的任何整数。
但请注意,如果为null、非整数或不存在,则API返回值将无法正确接收。
概括
您可以从 Zabbix API 添加和更改监视器,因此大多数事情都可以从 API 完成。
此外,虽然它们不直接执行 API,但已经开发了插件,允许您从 ansible 和 terraform 注册主机(该软件使用 API 来反映设置),因此我们拥有一个可以自动化所有操作的环境施工到监测。
您可以定期从 AWS Lambda 或 Cloud Functions 访问它,或者从 cron 定期运行它,我希望越来越多地使用它来自动执行定期主机运行状况检查和更改设置。
在这里最新版本的Zabbix API文档,但是它只有英文版本,看起来不太友好,所以我认为首先需要进行一些尝试和错误。
在这种情况下,设置一个 Zabbix 服务器进行测试并检查执行情况会更安全。
就是这样。