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"
     },
     ······
]

猜你喜欢

转载自www.cnblogs.com/cheyunhua/p/10661176.html
今日推荐