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" }, ······]Zabbix Web API Get方法整合的更多相关文章
- zabbix调用api检索方法
环境 zabbix:172.16.128.16:zabbix_web:172.16.16.16/zabbix 用户名:Admin 密码:zabbix 获取的数据仅做参考,以Linux发送HTTP的PO ...
- 基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
我前面几篇随笔介绍了关于几篇关于SqlSugar的基础封装,已经可以直接应用在Winform项目开发上,并且基础接口也通过了单元测试,同时测试通过了一些Winform功能页面:本篇随笔继续深化应用开发 ...
- 我这么玩Web Api(一):帮助页面或用户手册(Microsoft and Swashbuckle Help Page)
前言 你需要为客户编写Api调用手册?你需要测试你的Api接口?你需要和前端进行接口对接?那么这篇文章应该可以帮到你.本文将介绍创建Web Api 帮助文档页面的两种方式,Microsoft Help ...
- Web API返回JSON数据
对Web API新手来说,不要忽略了ApiController 在web API中,方法的返回值如果是实体的话实际上是自动返回JSON数据的例如: 他的返回值就是这样的: { "Conten ...
- Web API WinForm使用HttpClient呼叫Web API
前言 之前几篇文章已经介绍了 Web 与 Web API 的使用方式,接下来将介绍如何在 Windows Form 呼叫 Web API 的方法,要在 WinForm 中使用 Web API 的话,除 ...
- WebApi系列~通过HttpClient来调用Web Api接口
回到目录 HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api ...
- Web API应用架构设计分析(1)
Web API 是一种应用接口框架,它能够构建HTTP服务以支撑更广泛的客户端(包括浏览器,手机和平板电脑等移动设备)的框架, ASP.NET Web API 是一种用于在 .NET Framewor ...
- Web Api 中Get 和 Post 请求的多种情况分析
转自:http://www.cnblogs.com/babycool/p/3922738.html 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用J ...
- ASP.NET Web API 学习【转】
转自:http://www.cnblogs.com/babycool/p/3922738.html 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用J ...
随机推荐
- Matlab提供了两种除法运算:左除(\)和右除(/)
Matlab提供了两种除法运算:左除(\)和右除(/).一般情况下,x=a\b是方程a*x =b的解,而x=b/a是方程x*a=b的解.例:a=[1 2 3; 4 2 6; 7 4 9]b ...
- Introduction to Dynamic SQL
The idea of using dynamic SQL is to execute SQL that will potentially generate and execute another S ...
- Tyche 2147 旅行
题目描述 你有m元钱,将要游览n个国家.每一个国家有一种商品,其中第i个国家商品的单价为ai元.每到一个国家,你会用手上的钱疯狂购买这个国家的商品,直到剩余的钱无法购买为止. 现在你要决定游览这n个国 ...
- Siki的虚幻第一季
空项目.一闪而过的解决方法 命名空间std::cout的作用: int ,long , long long类型的范围 unsigned int 0-4294967295 int 21474 ...
- Codeforces1101G (Zero XOR Subset)-less 【线性基】【贪心】
题目分析: 考虑到这是一个区间的异或问题,不妨求出前缀和,令$sum[i] = Xor_{j=1}^{i}a[j]$. 对于区间$[l,r]$的异或结果,等于$sum[r] \oplus sum[l- ...
- POJ 3667 Hotel(算竞进阶习题)
线段树区间染色 题目要求最大的连续段的左端点,我们在查询的时候返回最左端即可,注意查找顺序,应该从左到右!! 另外这类染色的push_down其实比较简单,直接染成上一层的标记即可 push_up和连 ...
- python+unnitest时运行后不执行main函数里面的内容
1.使用工具pycharm运行unnitest程序遇到的问题 1) 问题:运行后无法生成报告:经print()发现未执行main函数里的内容 2) 原因:使用unnitest测试框架,pycharm运 ...
- bzoj 1015: [JSOI2008]星球大战starwar (逆向思维+并查集)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1015 思路: 题目是要我们对当前图拆掉k个点,问,每拆一个点后图中有多少个联通块,我们可以逆 ...
- Gulp 新手使用
Gulp 注意:gulp依赖于nodejs,在安装前要确保已经安装node环境,如为安装查看<windows系统下nodejs安装及环境配置>安装node环境. 1.全局安装 在命令行执行 ...
- 【CF618F】Double Knapsack(构造)
[CF618F]Double Knapsack(构造) 题面 洛谷 Codeforces 题解 很妙的一道题. 发现找两个数集很不爽,我们强制加强限制,我们来找两个区间,使得他们的区间和相等. 把区间 ...