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