博文|你還在用python寫API,趕緊體驗全新curl、jq的API!
本實驗中,將使用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文件被設計用來接收請求用的。
本實驗中,將使用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
# or:
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 token
auth=$(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 user
curl -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
mysql8mon
riga
API Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。