Zabbix Web API Get方法整合
#!/usr/bin/python3
import requests,json,re,time,datetimeurl = '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)f24008481e287qc1e931e6598c041od6def 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" }, ······]

浙公网安备 33010602011771号