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 ...
- over-relaxation
逐次超松弛sor 参考1https://blog.csdn.net/lusongno1/article/details/68941137 有各种对比和程序 主要就是取了加权平均,没仔细看
- Deconvolution用法
- luogu3702-[SDOI2017]序列计数
Description Alice想要得到一个长度为nn的序列,序列中的数都是不超过mm的正整数,而且这nn个数的和是pp的倍数. Alice还希望,这nn个数中,至少有一个数是质数. Alice想知 ...
- 【数学建模】day05-微分方程建模
很多问题,归结起来是微分方程(组)求解的问题.比如:为什么使用三级火箭发射卫星.阻滞增长人口模型的建立…… MATLAB提供了良好的微分方程求解方案. 一.MATLAB求微分方程的符号解 matlab ...
- 【C/C++】c文件重点总结
c文件重点知识总结 程序文件数据文件--->分文本文件(ASCII文件)和映像文件(二进制文件) .区分是用记事本打开后能否看懂. 用二进制文件读写花费时间少,因为用文本文件需要有一个转换的过程 ...
- 19JDBC初体验
一.JDBC常用类和接口 JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API.JDBC是Java访问数据库的标准规范,可以为 ...
- HUST 1555 数学作业
参考自:https://www.cnblogs.com/ECJTUACM-873284962/p/6394892.html 1555 - A Math Homework 时间限制:1秒 内存限制:12 ...
- C Looooops POJ - 2115 拓展gcd 有一个定理待补()
补算法导论P564 MODULAR-LINEAR-EQUATION-SOLVER算法(P564)
- expect交互式安装软件
公司一些宿主机需要安装软件,吴老师要求写一个安装脚本: 脚本思路:首先要把安装的包拷贝到每台机器上,然后要让每台机器都运行一次安装命令:就想到了应用scp.ssh命令,但这两个命令需要输入对端密码,需 ...