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"
},
······
]
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 ...
随机推荐
- 9.Pod控制器概念和基本操作2
利用一个简单的例子来启动一个deployment的Pod控制器 [root@master song]# cat deploy.yml apiVersion: apps/v1 kind: Deploym ...
- gevent监测单线程下的io进行切换
from gevent import monkey;monkey.patch_all() import gevent import time def eat(name): print('%s eat ...
- CUDA开发
CUB库 https://nvlabs.github.io/cub/index.html
- 51Nod1778 小Q的集合 【组合数】【Lucas定理】
题目分析: 题解好高深...... 我给一个辣鸡做法算了,题解真的看不懂. 注意到方差恒为$0$,那么其实就是要我们求$\sum_{i=0}^{n}\binom{n}{i}(i^k-(n-i)^k)^ ...
- SpringBoot整合ssm
1.创建工程 使用idea可以快速创建SpringBoot的工程 这里选择常用的类库,SpringBoot将各种框架类库都进行了封装,可以减少pom文件中的引用配置: 比如Spring和Mybatis ...
- FPGA中亚稳态相关问题及跨时钟域处理
前言 触发器输入端口的数据在时间窗口内发生变化,会导致时序违例.触发器的输出在一段时间内徘徊在一个中间电平,既不是0也不是1.这段时间称为决断时间(resolution time).经过resolut ...
- bzoj 3123 [Sdoi2013]森林(主席树+启发式合并+LCA)
Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...
- LOJ #2359. 「NOIP2016」天天爱跑步(倍增+线段树合并)
题意 LOJ #2359. 「NOIP2016」天天爱跑步 题解 考虑把一个玩家的路径 \((x, y)\) 拆成两条,一条是 \(x\) 到 \(lca\) ( \(x, y\) 最近公共祖先) 的 ...
- [NOIp2008] 双栈排序 (二分图染色 + 贪心)
题意 给你一个长为 \(n\) 的序列 \(p\) ,问是否能够通过对于两个栈进行 push, pop(print) 操作使得最后输出序列单调递增(即为 \(1 \cdots n\) ),如果无解输出 ...
- Educational Codeforces Round 33 (Rated for Div. 2) F. Subtree Minimum Query(主席树合并)
题意 给定一棵 \(n\) 个点的带点权树,以 \(1\) 为根, \(m\) 次询问,每次询问给出两个值 \(p, k\) ,求以下值: \(p\) 的子树中距离 \(p \le k\) 的所有点权 ...