• python3 调用zabbix API实现批量增加删除主机,主机各种监控项------实战


    在以前的博客中谈到了利用zabbix接口来对主机进行批量的增删改查

    这里在不用环境中实战遇到了不同问题,这里记录下来以便后续review

    以下为实战中获取token的代码,在zabbix标准接口文档中  写道 

    POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1

    但是由于部署的方式不同 在生产环境中   

    http://XXX/api_jsonrpc.php 应该是这个地址(这里卡了很久 由于不是本人部署)
    import requests
    import json
    def getToken():
        url = 'http://XXX/api_jsonrpc.php'
    
        headers = {'Content-Type': 'application/json'}
        auth = {
            "jsonrpc": "2.0",
            "method": "user.login",
            "params": {
                "user": "XXXXX",  ###验证
                "password": "XXXXX#123"
            },
            "id": 1,
            "auth": None
        }
        response = requests.post(url, data=json.dumps(auth), headers=headers)
        authid = json.loads(response.text)['result']  ### auth的id  也就是token
    
        print(authid)
    
    getToken()

    结果如下获取到token

      获取到token之后由于需要批量加聚合图形,所以我们先看下加聚合图形需要那些参数   https://www.zabbix.com/documentation/3.4/zh/manual/api/reference/screen/create

    {
        "jsonrpc": "2.0",
        "method": "screen.create",
        "params": {
            "name": "Graphs",
            "hsize": 3,
            "vsize": 2,
            "screenitems": [
                {
                    "resourcetype": 0,
                    "resourceid": "612",
                    "rowspan": 0,
                    "colspan": 0,
                    "x": 0,
                    "y": 0
                }
            ]
        },
        "auth": "038e1d7b1735c6a5436ee9eae095879e",
        "id": 1
    }

    上图是一个典型的request,其中 jsonrpc method 数固定的 

    hsize:水平尺寸  可以简单的理解为 这个聚合图形最多可以有多少行

      vsize:垂直尺寸   同理,这个聚合图形最多可以有多少列

      resourcetye :图形的类型  0 代表graph  1 简单graph 2 文本 。。。。

      resourceid :ID of the screen that the item belongs to. 也就是说需要加入的图形它的ID是多少,那么图形ID怎么获取呢? 接下来讲解

      rowspan:屏幕项目将跨越的行数。

      colspan:屏幕项目将跨越的列数。  意思就是图形占多少行多少列  这里 默认为0就行(1行1列)  不需要太大

      x: 代表列!!!!!!!!!!!!!不是行

      y:  这里的x y代表的是图形的坐标 0 0 就是第一行第一列  0 1 第一行第二列 依次类推(这里需要依靠前面设置的hsize,vsize不能超过了),测试的时候这里面体比较大,想要把多个监控放在一行:解决办法是x相同y不同

      auth : 认证信息

      id : 识别方法

    下面是我的代码

    def create_screen():
        neirong = {
            "jsonrpc": "2.0",
            "method": "screen.create",
            "params": {
                "name": "Graphsall(disk,cpu,mem)",
                "hsize": 3, ###代表创建的时候 有多少列
                "vsize": 45, ## 行
                "screenitems": [
                    {'resourcetype': 0, 'resourceid': '42183', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 0},
                    {'resourcetype': 0, 'resourceid': '42189', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 0},
                    {'resourcetype': 0, 'resourceid': '42186', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 0},
                    {'resourcetype': 0, 'resourceid': '42195', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 1},
                    {'resourcetype': 0, 'resourceid': '42210', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 1},
                    {'resourcetype': 0, 'resourceid': '42198', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 1},
                    {'resourcetype': 0, 'resourceid': '42204', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 2},
                    {'resourcetype': 0, 'resourceid': '42213', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 2},
                    {'resourcetype': 0, 'resourceid': '42207', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 2},
                    {'resourcetype': 0, 'resourceid': '53703', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 3},
                    {'resourcetype': 0, 'resourceid': '53709', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 3},
                    {'resourcetype': 0, 'resourceid': '53706', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 3},
                    {'resourcetype': 0, 'resourceid': '53715', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 4},
                    {'resourcetype': 0, 'resourceid': '53739', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 4},
                    {'resourcetype': 0, 'resourceid': '53718', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 4},
                    {'resourcetype': 0, 'resourceid': '53724', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 5},
                    {'resourcetype': 0, 'resourceid': '53742', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 5},
                    {'resourcetype': 0, 'resourceid': '53727', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 5},
                    {'resourcetype': 0, 'resourceid': '53733', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 6},
                    {'resourcetype': 0, 'resourceid': '53745', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 6},
                    {'resourcetype': 0, 'resourceid': '53736', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 6},
                    {'resourcetype': 0, 'resourceid': '53751', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 7},
                ]
            },
            "auth": authid,
            "id": 4
        }

    这里用的是笨办法 将所有数据想办法生成统一格式,然后批量加,其实可以潜逃变量来完成

    这里面有个resourceid 获取的方法如下

    def get_graid():
        global graphid
        graphid = []
        for i in hostidlist:
            neirong = {
                "jsonrpc": "2.0",
                "method": "graph.get",
                "params": {
                    "output": "extend",
                    "hostids": i,
                    "sortfield": "name"
                },
                "auth": authid,
                "id": 1
            }
            response1 = requests.post(url, data=json.dumps(neirong), headers=headers)
            result1 = (response1.text)
            result2 = json.loads(result1)
            #print("zhujiname is %s"%i)
            #print("reeeeeeeeee is %s"%result2)
    
            graphid11 = []
    #result2['result']代表的是一个主机的全部图形
      #      print(result2)
            for i in result2['result']:
                 if i['name']=='CPU utilization' or  i['name']=='Memory usage' or i['name']=='Disk space usage /' :
                     graphid11.append(i['graphid'])
    
            if(len(graphid11)) == 3:       ## 如果等于3 那么再次循环把这些记录下来。。 比较笨拙 需要改进
                for i in result2['result']:
                    if i['name']=='CPU utilization' or  i['name']=='Memory usage' or i['name']=='Disk space usage /' :
                        graphid.append(i['graphid'])
    #获取到的图形id的列表
        print(graphid)

    上面的程序对每个主机的图形数量进行了比较,因为我们目的是 每台主机在聚合图形中显示一行 分别是CPU utilization Memory usage Disk space usage

    上图上还有个hostid变量这个变量需要gethost来获取

    import requests
    import json
    
    url = 'http://zabbix.XXXXX.com.cn/api_jsonrpc.php'
    headers = {'Content-Type': 'application/json'}
    def getToken():
        url = 'http://zabbix.pagoda.com.cn/api_jsonrpc.php'
    
        headers = {'Content-Type': 'application/json'}
        auth = {
            "jsonrpc": "2.0",
            "method": "user.login",
            "params": {
                "user": "XXXX",  ###验证
                "password": "XXX"
            },
            "id": 1,
            "auth": None
        }
        response = requests.post(url, data=json.dumps(auth), headers=headers)
        global authid
        authid = json.loads(response.text)['result']  ### auth的id  也就是token
    
    def getHosts():
        neirong = {
            "jsonrpc": "2.0",
            "method": "host.get",
            "params": {
                "output": [
                    "hostid",
                    "host"
                ],
                "selectInterfaces": [
                    "interfaceid",
                    "ip"
                ]
            },
            "id": 2,
            "auth": authid
        }
        response = requests.post(url, data=json.dumps(neirong), headers=headers)
        result1=(response.text)
        result2=json.loads(result1)
    
        global hostidlist
        hostidlist=[]
        for i in result2['result']:
            #将主机放到一个列表里面
            hostidlist.append(i['hostid'])

    如上图所示

  • 相关阅读:
    redis之哨兵配置-2
    redis之主从配置-1
    MYSQL 在当前时间加上或减去一个时间段
    【转】将long数字序列化为json时,转换为字符串
    从技术到产品,从职场到创业,我这7年的痕迹
    可能是东半球第二好用的软件工具全部在这里(update in 2020.10.09)
    Java架构师面试题答案2020备忘录
    学习方法
    《精力管理》管理精力,而非时间
    《道德经》全文
  • 原文地址:https://www.cnblogs.com/ZFBG/p/10212663.html
Copyright © 2020-2023  润新知