暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

Zabbix开源社区 2021-03-11
236

感谢译者张宇供稿!


张宇 | Zabbix 高级认证专家 ZCP

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

  • Zabbix在线课程讲师。

本实验中,将使用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



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


                                业务需求

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

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

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


                                点击报名即可获得录屏和课件,大好青春,来学习吧。


                                关注Zabbix开源社区

                                干货满满

                                加“小Z“入群

                                3000+Zabbixer已加入

                                文章转载自Zabbix开源社区,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                评论