zoukankan      html  css  js  c++  java
  • Zabbix Web API Get方法整合

    #!/usr/bin/python3

    import requests,json,re,time,datetime
     
     
    url = 'http://xxx.com/api_jsonrpc.php'
    headers = {"Content-Type":"application/json"'User-Agent''Godaner.com python-requests'#设置请求头
    username = 'username'     #用户名
    password = 'passwd'        #密码
     
    def get_token():            #获取认证token,token有效时间为zabbix用户配置的自动退出时间
        data = {
            "jsonrpc""2.0",
            "method""user.login",
            "params": {
                "user": username,
                "password": password
            },
            "id"0
        }
        try:
            resp = requests.post(url=url, headers=headers, data=json.dumps(data))
            token = json.loads(resp.text)['result']
            #resp.close()
        except:
            return 'F'
        return token
    #示例获取token 
    token = get_token()
    print(token)
    f24008481e287qc1e931e6598c041od6
     
     
    def get_host(token,ip2host=""):
        if ip2host:
            selectItems = "selectItems"
            selectTriggers = "selectTriggers"
        else:
            selectItems = ""
            selectTriggers = ""
        if re.search('[a-z]', ip2host):
            arg = 'host'
        else:
            arg = 'ip'
        #获取单个或者所有zabbix主机信息,ip2host(IP,主机名)为空获取所有主机信息
        #获取所有主机的时候将不输出对应主机的监控项和触发器信息。(大量主机)
        data = {
            "jsonrpc""2.0",
            "method""host.get",
            "params": {
                "output": ["hostid","name","status","available"],
                #返回: [主机id,主机名,主机状态(0监控中|1未监控),主机的可用性(0可用|1不可用)]
                selectItems: ["itemid","key_","name","value_type","status","lastclock","lastvalue"],
                #返回此主机的监控项信息:[id,key,名称,数据类型,可用性(0 启用|1 禁用),上次取值时间,最后一次的值]
                #特别注意value_type,这个参数是创建监控项时,选择的返回值数据类型。当获取不到item值的时候,要注意此值:
                #0 浮点数;1 字符串;2 日志;3 整数 默认值;4 文本长字符串
                selectTriggers: ["expression","priority","status","value"],
                #返回此主机的触发器信息:[触发器表达式,严重级别(0-5),可用性(0 启用|1 禁用),触发器状态(0 正常|1 问题)]
                "selectGroups": ["groupid","name"],
                #返回此主机所在组:[组id,组名]
                "selectInterfaces": ["interfaceid","ip","port"],
                #返回此主机连接信息:[网卡id,ip地址,端口]
                "selectParentTemplates": ["templateid","name"],
                #返回此主机连接的模板信息:[模板id,模板名]
                "filter": {
                    arg: ip2host,
                },
                #过滤,这个跟上面的逻辑对应,这里过滤ip或者主机名,只在ip2host参数有值时生效
            },
        "id"0,
        "auth": token,
        }
        resp = requests.post(url=url, headers=headers, data=json.dumps(data))
        return json.loads(resp.text)['result']
    #示例 获取所有主机和单个主机,单个主机的时候返回监控项和触发器信息
    hosts = get_host(token)    #获取所有主机信息
    print(json.dumps(hosts, indent=4, ensure_ascii=False))
    [    
        {
            "status""0",
            "name""xxxxxxxxxx",
            "hostid""14700"
            "available""1",
            "parentTemplates": [
                {
                    "templateid""12601",
                    "name""Agent_SH"
                },
                {
                    "templateid""13025",
                    "name""Template_Apps"
                }
            ],
            "interfaces": [
                {
                    "interfaceid""4771",
                    "ip""xx.xx.xx.xx",
                    "port""10050"
                }
            ],
            "groups": [
                {
                    "name""Discovered hosts",
                    "groupid""5"
                },
                {
                    "name""OS_CentOS",
                    "groupid""15"
                }
            ],
        },
        {
            "status""0",
            "name""xxxxxxxxxx",
            "hostid""14701"
            "available""1",
            "parentTemplates": [
                {
                    "templateid""12601",
                    "name""Agent_SH"
                },
                {
                    "templateid""13025",
                    "name""Template_Apps"
                }
            ],
            "interfaces": [
                {
                    "interfaceid""4834",
                    "ip""xx.xx.xx.xx",
                    "port""10050"
                }
            ],
            "groups": [
                {
                    "name""Discovered hosts",
                    "groupid""5"
                },
                {
                    "name""OS_CentOS",
                    "groupid""15"
                }
            ],
        },   
        ······
    ]
    host = get_host(token,ip2host='x.x.x.x')    #获取单个主机信息,带项目和触发器信息
    print(json.dumps(host, indent=4, ensure_ascii=False))
    [
        {
            "interfaces": [
                {
                    "ip""x.x.x.x",
                    "interfaceid""1",
                    "port""10050"
                }
            ],
            "name""Godaner",
            "items": [
                {
                    "name""check iptables",
                    "lastvalue""it's ok",
                    "key_""fwcheck",
                    "value_type""4",
                    "itemid""23833",
                    "lastclock""1554515244",
                    "status""0"
                },
                {
                    "name""login",
                    "lastvalue""Apr 5 16:43:37 Godaner sshd[24987]: Accepted password for ····",
                    "key_""log[/var/log/secure,"Accepted password",,,skip,]",
                    "value_type""2",
                    "itemid""23767",
                    "lastclock""1554453825",
                    "status""0"
                },          
                ······
            ],
            "triggers": [
                {
                    "value""0",
                    "status""0",
                    "priority""5",
                    "expression""{13220}=0 and {13221}=0",
                    "triggerid""13614"
                },
                {
                    "value""0",
                    "status""0",
                    "priority""4",
                    "expression""{13299}>1",
                    "triggerid""13616"
                },           
                ······
            ],
            "hostid""10084",
            "groups": [
                {
                    "name""testgroup",
                    "groupid""4"
                }
            ],
            "available""1",
            "status""0"
        }
    ]
     
     
    def get_trigger_bad(token,hostid=""): 
        if not hostid:
            arg = ""
        else:
            arg = "hostids"
        #获取问题触发器,hostid为空时,获取所有问题触发器
        data = {
            "jsonrpc""2.0",
            "method""trigger.get",
            "params": {
                arg: hostid,
                "only_true"1,         #只返回最近处于问题状态的触发器
                "active"1,            #只返回启用的触发器
                #"skipDependent":1,     #在依赖于其他触发器的问题状态中跳过触发器
                "monitored":1,          #只返回所属被监控主机启用触发器,且包含已启用的监控项(跳过监控项不可用的问题触发器)
                "output": ["priority","status","value","description"],
                #输出: [严重级别|(启用|禁用)|(正常|问题)|触发器名称]
                "selectHosts": ["name"],#返回host,id
                #"selectItems": ["name"],#返回item,id
                "sortfield""priority",#以严重级别排序
                "sortorder""DESC",    #降序 
                "filter": {
                   "value"1,         #过滤问题触发器
                }
            },
        "id"0,
        "auth": token,
        }
        resp = requests.post(url=url, headers=headers, data=json.dumps(data))
        return json.loads(resp.text)['result']
    #示例 获取当前所有问题触发器
    trigger_bad = get_trigger_bad(token)
    print(json.dumps(trigger_bad, indent=4, ensure_ascii=False))
    [
        {
            "description""Filesystems: 可用磁盘空间少于 5% --> /usr",
            "hosts": [
                {
                    "hostid""13382",
                    "name""x.x.x.x"
                }
            ],
            "priority""2",
            "value""1",
            "triggerid""77341",
            "status""0"
        },
        {
            "description""zombie on {HOST.NAME}",
            "hosts": [
                {
                    "hostid""11820",
                    "name""x.x.x.x"
                }
            ],
            "priority""1",
            "value""1",
            "triggerid""63834",
            "status""0"
        },    
        ······    
    ]
     
     
    def get_groups(token):  #获取所有组信息,输出组id,组名
        data = {
            "jsonrpc""2.0",
            "method""hostgroup.get",
            "params": {
               "output": ["groupid","name"],
            },
            "auth": token,
            "id"0,
        }
        resp = requests.post(url=url, headers=headers, data=json.dumps(data))
        return json.loads(resp.text)['result']
    #示例 获取所有组
    groups = get_groups(token)
    print(json.dumps(groups, indent=4, ensure_ascii=False))
    [
        {
            "name""SH",
            "groupid""49"
        },
        {
            "name""HK",
            "groupid""4"
        },
        ······
    ]
     
     
    def get_group_hosts(token, groupid):    #获取指定组id里的所有主机,输出主机名跟id
        data = {
            "jsonrpc""2.0",
            "method""host.get"
            "params": {
                "groupids": groupid,
                "output": ["host","hostid"],
            },
            "auth": token,
            "id"0,
        }
        resp = requests.post(url=url, headers=headers, data=json.dumps(data))
        return json.loads(resp.text)['result']
    #示例 获取指定组里所有主机
    hosts = get_group_hosts(token,groupid='xxx')
    print(json.dumps(hosts, indent=4, ensure_ascii=False))
    [
        {
            "host""web.zabbix",
            "hostid""13247"
        },
        {
            "host""db.zabbix",
            "hostid""14045"
        },
        ······
    ]
     
     
    def get_items(token, hostid, key=""): #获取指定主机所有监控项,也可指定key名称获取。 
        if re.search('[a-z]', key):
            arg = "key_"
        else:
            arg = "itemid"
        data = {
            'jsonrpc''2.0',
            'method'"item.get",
            "params": {
                "output": ["itemid","key_","name","value_type","status","lastclock","lastvalue"],
                #输出信息跟上面的get_host里的selectItems一样
                "hostids": hostid,
                "filter":{
                    arg: key,
                },
            },
            'auth': token,
            'id'0,
        }
        resp = requests.post(url=url, headers=headers, data=json.dumps(data))
        return json.loads(resp.text)['result']
    #示例 获取单个主机所有监控项
    itemids = get_items(token,hostid='xxxx')
    print(json.dumps(itemids, indent=4, ensure_ascii=False))
    [
        {
            "lastclock""1554514630",
            "value_type""3",
            "key_""vm.memory.size[total]",
            "name""Total memory",
            "itemid""23830",
            "lastvalue""17180569600",
            "status""0"
        },
        {
            "lastclock""1554517503",
            "value_type""3",
            "key_""webcheck",
            "name""check www.godaner.com",
            "itemid""23832",
            "lastvalue""200",
            "status""0"
        },
        ······
    ]
     
     
    def get_history(token, itemid, limit="10", stime="", etime="", vtp="3"):
        #get_history(token=get_token(),itemid='23809')返回指定监控项23809最近10条数据
        #如果没有值,注意vtp,默认是整数型的,比如要取cpu load的值,就要用vtp=0
        if not etime:
            etime = time.time()
        #不指定结束时间,结束之间为当前时间,也可指定时间段查询,单位为时间戳
        data = {
            "jsonrpc""2.0",
            "method""history.get",
            "params": {
                "output""extend",     #输出所有
                "history": vtp,         #值存储的数据类型
                "itemids": itemid,      #itemid
                "sortfield""clock",   #以时间排序
                "sortorder""DESC",    #倒序
                "limit": limit,         #返回数据的条数
                "time_from": stime,     #返回在给定时间时或之后收到的值
                "time_till": etime,     #返回在给定时间时或之前收到的值
            },
            "auth": token,
            "id"0,
        }
        resp = requests.post(url=url, headers=headers, data=json.dumps(data))
        return json.loads(resp.text)['result']
    #示例 获取单个item最近10次的历史记录,也可指定某个时间段,此例为默认
    history = get_history(token,itemid='23832')
    print(json.dumps(history, indent=4, ensure_ascii=False))
    [
        {
            "itemid""23832",
            "ns""670291350",
            "clock""1554516780",
            "value""200"
        },
        {
            "itemid""23832",
            "ns""41115479",
            "clock""1554516660",
            "value""502"
        },
        ······
    ]
     
     
    def get_events(token,tfrom):
        #某个时间之后,由问题触发器产生的事件
        data = {
            "jsonrpc""2.0",
            "method""event.get",
            "params": {
                "output": ["eventid","clock","value"],
                #返回:[事件id,事件,
                #"value这个值是相关对象状态,这个值可能来自于触发器,可能是自动发现,还有可能是内部事件,记住1是问题就行"]
                #"time_from": time.mktime((datetime.datetime.now() - datetime.timedelta(days=1)).timetuple()),
                "time_from": tfrom,         #返回这个时间戳之后的事件
                "selectHosts": ["name"],    #返回这个事件是哪个主机产生的
                "selectRelatedObject": ["triggerid","description"],
                #返回这个事件是哪个对象产生的,如果是触发器的话返回[触发器id,触发器名称]
                "sortfield": ["clock"],     #以时间排序
                "sortorder""desc",        #倒序
                "filter": {                 #过滤
                    "source""0",          #0 触发器,1 自动发现,2 自动注册,3内部事件
                    "object""0",          #0,1,2,3 同上,0就是触发器事件
                    "value""1",           #0 正常事件,1 故障事件
                }
            },
        "auth": token,
        "id"0,
        }
        resp = requests.post(url=url, headers=headers, data=json.dumps(data))
        return json.loads(resp.text)['result']
    #示例 获取某个时间之后,所有由问题触发器产生的事件
    events = get_events(token,tfrom='1554315660')
    print(json.dumps(events, indent=4, ensure_ascii=False))
    [
        {
            "eventid""10375",
            "hosts": [
                {
                    "name""Godaner",
                    "hostid""10084"
                }
            ],
            "clock""1554374074",
            "relatedObject": {
                "triggerid""13654",
                "description""check www.godaner.com"
            },
            "value""1"
        },
        {
            "eventid""10376",
            "hosts": [
                {
                    "name""Godaner",
                    "hostid""10084"
                }
            ],
            "clock""1554374194",
            "relatedObject": {
                "triggerid""13654",
                "description""check www.godaner.com"
            },
            "value""1"
        },
        ······
    ]
     
     
    def get_alerts(token,tfrom):
        #获取报警信息
        data = {
            "jsonrpc""2.0",
            "method""alert.get",
            "params": {
                "output": ["eventid","subject","clock","esc_step"],
                #输出:[事件id,报警主题,报警时间,
                #警次次数,这个报警次数是针对单事件的,多事件报警这个值永远为1。多事件就是在创建触发器那里有个多事件选择
                #这个值就可以很好的判断 这个报警持续了多久 重要哦]
                "time_from": tfrom,
                #返回这个时间戳之后的报警,上面这个是1天(24小时)前的时间戳
                "selectHosts": ["name"],    #返回报警主机的主机名
                "sortfield": ["clock"],     #以时间排序
                "sortorder""desc",        #倒序
            },
            "auth": token,
            "id"0,
        }
        resp = requests.post(url=url, headers=headers, data=json.dumps(data))
        return json.loads(resp.text)['result']
    #示例 获取24小时内报警信息
    tt = time.mktime((datetime.datetime.now() - datetime.timedelta(days=3)).timetuple())
    alerts = get_alerts(token,tfrom=tt)
    print(json.dumps(alerts, indent=4, ensure_ascii=False))
    [
        {
            "clock""1554374317",
            "esc_step""3",
            "subject""Godaner: check www.godaner.com",
            "hosts": [
                {
                    "hostid""10084",
                    "name""Godaner"
                }
            ],
            "eventid""10376",
            "alertid""10129"
        },
        {
            "clock""1554374317",
            "esc_step""3",
            "subject""Godaner: check www.godaner.com",
            "hosts": [
                {
                    "hostid""10084",
                    "name""Godaner"
                }
            ],
            "eventid""10376",
            "alertid""10130"
        },
        ······
    ]
  • 相关阅读:
    PHP 5.5.0 Alpha5 发布
    Ubuntu Touch 只是另一个 Android 皮肤?
    MariaDB 10 已经为动态列提供文档说明
    Percona Toolkit 2.1.9 发布,MySQL 管理工具
    Oracle Linux 6.4 发布
    Ruby 2.0.0 首个稳定版本(p0)发布
    Apache Pig 0.11.0 发布,大规模数据分析
    Node.js 0.8.21 稳定版发布
    红薯 MySQL 5.5 和 5.6 默认参数值的差异
    Django 1.5 正式版发布,支持 Python 3
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/10661176.html
Copyright © 2011-2022 走看看