#!/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"
    },
    ······
]

发表评论

邮箱地址不会被公开。 必填项已用*标注