本实验中,将使用bash环境与实用程序“curl”和“jq”来执行Zabbix API调用并编写一些脚本。“curl”是一个通过HTTP/HTTPS交换JSON消息的工具。实用程序“jq”有助于定位和提取输出中的特定元素。
为了进行实验需要安装“jq”:
# On CentOS7/RHEL7:
yum install epel-release && yum install jq
# On CentOS8/RHEL8:dnf install jq
# On Ubuntu/Debian:apt install jq
# On any 64-bit Linux platform:curl -skL "https://github.com/stedolan/jq/releases/download/jq1.5/jq-linux64" -o /usr/bin/jq && chmod +x /usr/bin/jq
获取一个授权令牌
为了使API调用运作,需要:
-
定义一个API地址。这是一个URL,这个地址后端是个php文件被设计用来接收请求用的。
-
获取一个授权令牌。
如果趋向于从前端服务器执行API调用,那么有可能出现以下情况。
url=http://127.0.0.1/api_jsonrpc.php
url=http://127.0.0.1/zabbix/api_jsonrpc.php
为跳转到下一步,必须设置URL变量来测试是否已经配置:
echo $url
任何API调用都需要通过授权令牌才可使用。使用以下命令,将一个授权令牌放入变量:
auth=$(curl -s -X POST -H 'Content-Type: application/json-rpc' \
-d '
{"jsonrpc":"2.0","method":"user.login","params":
{"user":"api","password":"zabbix"},
"id":1,"auth":null}
' $url | \
jq -r .result)
注:注意用户“api”的密码是“zabbix”,这是API调用的专用用户。
检查是否有会话密钥,应该是32字符的十六进制字符串:
echo $auth
整体思路
1)访问文档页面并选择一个API方法,例如alert.get:
{
"jsonrpc": "2.0",
"method": "alert.get",
"params": {
"output": "extend",
"actionids": "3"},
"auth": "038e1d7b1735c6a5436ee9eae095879e",
"id": 1
}
2)使用你最熟悉的text编辑器,使用查找和替换功能转义所有的双引号。
{
\"jsonrpc\": \"2.0\",\"method\": \"alert.get\",
\"params\": {
\"output\": \"extend\",\"actionids\": \"3\"
},
\"auth\": \"038e1d7b1735c6a5436ee9eae095879e\",\"id\": 1
}
注:千万别想着手动完成这个过程!
3)用我们的变量$auth替换会话密钥038e1d7b1735c6a5436ee9eae095879e
{
\"jsonrpc\": \"2.0\",
\"method\": \"alert.get\",\"params\": {
\"output\": \"extend\",
\"actionids\": \"3\"
},\"auth\": \"$auth\",
\"id\": 1
}
4)现在用curl封装API命令:
curl -s -X POST \
-H 'Content-Type: application/json-rpc' \
-d " \
{\"jsonrpc\": \"2.0\",
\"method\": \"alert.get\",
\"params\": {
\"output\": \"extend\",\"actionids\": \"3\"
},
\"auth\": \"$auth\",
\"id\": 1
}
" $url
通过执行前面的命令,应该已经在响应中输出了一个JSON内容。
为了使输出更漂亮,我们可以将其传送到jq .:
curl -s -X POST \
-H 'Content-Type: application/json-rpc' \
-d " \
{\"jsonrpc\": \"2.0\",
\"method\": \"alert.get\",
\"params\": {\"output\": \"extend\",
\"actionids\": \"3\"
},
\"auth\": \"$auth\",
\"id\": 1
}
" $url | jq .
将所有内容打包为一个文件
现在准备好使用代码片段了:
#!/bin/bash
# 1. set connection details
url=http://127.0.0.1/api_jsonrpc.php
user=api
password=zabbix
# 2. get authorization tokenauth=$(curl -s -X POST \
-H 'Content-Type: application/json-rpc' \
-d " \
{
\"jsonrpc\": \"2.0\",
\"method\": \"user.login\",
\"params\": {
\"user\": \"$user\",
\"password\": \"$password\"
},\"id\": 1,
\"auth\": null
}" $url | \
jq -r '.result'
)
# 3. show triggers in problem state
curl -s -X POST \
-H 'Content-Type: application/json-rpc' \
-d " \
{
\"jsonrpc\": \"2.0\",
\"method\": \"trigger.get\",
\"params\": {
\"output\": \"extend\",
\"selectHosts\": \"extend\",
\"filter\": {
\"value\": 1
},
\"sortfield\": \"priority\",\"sortorder\": \"DESC\"
},
\"auth\": \"$auth\",
\"id\": 1
}" $url | \
jq -r
'.result'
# 4. logout usercurl -s -X POST \
-H 'Content-Type: application/json-rpc' \
-d " \
{
\"jsonrpc\": \"2.0\",
\"method\": \"user.logout\",
\"params\": [],
\"id\": 1,
\"auth\": \"$auth\"}
" $url
便利性
我们可以使用https://jsonpathfinder.com/来辨别提取元素的路径。
例如,利用API调用列出所有使用的Zabbix proxy:
curl -s -X POST \
-H 'Content-Type: application/json-rpc' \
-d " \{
\"jsonrpc\": \"2.0\",
\"method\": \"proxy.get\",
\"params\": {
\"output\": [\"host\"]
},\"auth\": \"$auth\",
\"id\": 1
}
" $url
它可能输出以下内容:
{"jsonrpc":"2.0","result":[{"host":"broceni","proxyid":"10387"},{"host":"mysql8mon","proxyid":"12066"},{"host":"riga","proxyid":"12585"}],"id":1}
在JSONPathFinder中,通过在右侧面板上单击鼠标,我们可以定位需要提取的样本元素:
它建议路径“x.result[1].host”。这意味着为提取所有元素,可以移除数字并如下所示使用“.result[].host”:
curl -s -X POST \
-H 'Content-Type: application/json-rpc' \
-d " \{
\"jsonrpc\": \"2.0\",
\"method\": \"proxy.get\",
\"params\": {
\"output\": [\"host\"]
},
\"auth\": \"$auth\",\"id\": 1
}
" $url | jq -r '.result[].host'
现在它仅输出proxy标题:
broceni
mysql8monriga