前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >博文|你还在用python写API,赶紧体验全新curl、jq的API!

博文|你还在用python写API,赶紧体验全新curl、jq的API!

作者头像
Zabbix
发布2021-03-23 11:47:08
7630
发布2021-03-23 11:47:08
举报
文章被收录于专栏:Zabbix中国官方Zabbix中国官方

张宇 | Zabbix 高级认证专家 ZCP

  • 参与过国内多家银行、保险客户的Zabbix监控实施,有着丰富的Zabbix实施经验。
  • Zabbix在线课程讲师。

本实验中,将使用bash环境与实用程序“curl”和“jq”来执行Zabbix API调用并编写一些脚本。“curl”是一个通过HTTP/HTTPS交换JSON消息的工具。实用程序“jq”有助于定位和提取输出中的特定元素。

为了进行实验需要安装“jq”:

代码语言:javascript
复制
# 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调用,那么有可能出现以下情况。

代码语言:javascript
复制
url=http://127.0.0.1/api_jsonrpc.php
# or:
url=http://127.0.0.1/zabbix/api_jsonrpc.php

为跳转到下一步,必须设置URL变量来测试是否已经配置:

代码语言:javascript
复制
echo $url

任何API调用都需要通过授权令牌才可使用。使用以下命令,将一个授权令牌放入变量:

代码语言:javascript
复制
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字符的十六进制字符串:

代码语言:javascript
复制
echo $auth

整体思路

1)访问文档页面并选择一个API方法,例如alert.get:

代码语言:javascript
复制
{
"jsonrpc": "2.0",
"method": "alert.get",
"params": {
  "output": "extend",
  "actionids": "3"
},
"auth": "038e1d7b1735c6a5436ee9eae095879e",
"id": 1
}

2)使用你最熟悉的text编辑器,使用查找和替换功能转义所有的双引号。

代码语言:javascript
复制
{
\"jsonrpc\": \"2.0\",
\"method\": \"alert.get\",
\"params\": {
  \"output\": \"extend\",
  \"actionids\": \"3\"
},
\"auth\": \"038e1d7b1735c6a5436ee9eae095879e\",
\"id\": 1
}

注:千万别想着手动完成这个过程!

3)用我们的变量$auth替换会话密钥038e1d7b1735c6a5436ee9eae095879e

代码语言:javascript
复制
{
\"jsonrpc\": \"2.0\",
\"method\": \"alert.get\",
\"params\": {
  \"output\": \"extend\",
  \"actionids\": \"3\"
},
\"auth\": \"$auth\",
\"id\": 1
}

4)现在用curl封装API命令:

代码语言:javascript
复制
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 .:

代码语言:javascript
复制
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 .

将所有内容打包为一个文件

现在准备好使用代码片段了:

代码语言:javascript
复制
#!/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:

代码语言:javascript
复制
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

它可能输出以下内容:

代码语言:javascript
复制
{"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”:

代码语言:javascript
复制
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标题:

代码语言:javascript
复制
broceni
mysql8mon
riga

在线课回顾:图形的调用和处理

业务需求

有什么需求可以用到图形的调用? 1. 告警邮件添加图形:图形的直观表达

2. 第三方系统展示:嵌入系统

3. 巡检报告导出:导出到文档中

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Zabbix开源社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档