Python 调用 zabbix api的方法示例


Posted in Python onJanuary 06, 2019

前提准备:

1.使用python requests模块

2.了解json

3.zabbix api的具体调用建议先浏览一下官网

先上代码:

import requests,json
#
#url一定要正确,IP地址换成自己zabbix服务器的
zbx_url = "http://192.168.60.130:3080/zabbix/api_jsonrpc.php"

#在post请求头部必须要有 'Content-Type': 'application/json-rpc'
headers = {'Content-Type': 'application/json-rpc'}

#传递json 数据到api;登录
login = {
  "jsonrpc": "2.0",
  "method": "user.login",
  "params": {
    "user": "Admin",
    "password": "zabbix"
  },
  "id": 1
}
#首次登陆不用在json字段中写 auth,否则会有相关的报错

#将数据发送到api
ret = requests.post(zbx_url, data=json.dumps(login), headers=headers)

#对结果进行序列化
ret = ret.json()
auth = ret['result']

#获取问题主机json
data = {
  "jsonrpc": "2.0",
  "method":"trigger.get",
  "params": {
    # output表示输出结果包含参数有哪些
    "output": [
      "triggerid",
      "description",
      "status",
      "value",
      "priority",
      "lastchange",
      "recovery_mode",
      "hosts",
      "state",
    ],
    "selectHosts": "hosts", # 需包含主机ID信息,以便于根据主机ID查询主机信息
    "selectItems":"items",
    "filter": {
      # 筛选条件
       "value": 1,#value值为1表示有问题
       "status": 0#status为0表示已启用的trigger
    },
  },
  "auth":auth,#这里的auth就是登录后获取的
  'id':'1'#这个id可以随意
}

#将查询数据发送到zabbix-server
ret = requests.post(zbx_url,data=json.dumps(data),headers=headers)

respone_result = ret.json()['result']#对结果进行json序列化

print(respone_result)

下面简单介绍一下上诉代码:

要调用zabbix api获取数据,首先要获得auth这一串字符用户后续的内容获取,auth可以看做是一种你与zabbix-server之间的"暗号";

登录的json内容之所以这样写是zabbix官方规定的,json字符串里面千万不能使用tab键。

login = {
  "jsonrpc": "2.0",
  "method": "user.login",
  "params": {
    "user": "Admin",     #根据自己的情况填
    "password": "zabbix"   #根据自己的条件填写
  },
  "id": 1
}

获取问题主机的json字符串建议先浏览一下官网的说明,要强调的是output和filter这两个key,output就是zabbix api返回来的内容,filter相当于是过滤条件:

"filter": {
      # 筛选条件
       "value": 1,       #value值为1表示有问题
       "status": 0       #status为0表示已启用的trigger
    },

上诉代码表示 value=1 and status=0,是一种与关系,很像查数据库表时候的过滤操作。

强烈建议先大概浏览一下官网文档

PS:Python通过Zabbix API获得数据的方法

Zabbix API查询:https://www.zabbix.com/documentation/2.0/manual/appendix/api/api

import json,urllib2
from urllib2 import Request, urlopen, URLError, HTTPError
#url and url header
#zabbix的api 地址,用户名,密码,这里修改为自己实际的参数
zabbix_url="http://10.16.2.40/zabbix/api_jsonrpc.php"
zabbix_header = {"Content-Type":"application/json"}
zabbix_user  = "admin"
zabbix_pass  = "password"
auth_code   = ""

#auth user and password
#用户认证信息的部分,最终的目的是得到一个SESSIONID
#这里是生成一个json格式的数据,用户名和密码
auth_data = json.dumps(
    {
      "jsonrpc":"2.0",
      "method":"user.login",
      "params":
          {
            "user":zabbix_user,
            "password":zabbix_pass
          },
      "id":0
    })

# create request object
request = urllib2.Request(zabbix_url,auth_data)

for key in zabbix_header:
  request.add_header(key,zabbix_header[key])

try:
  result = urllib2.urlopen(request)
#对于出错新的处理
except HTTPError, e:
  print 'The server couldn\'t fulfill the request, Error code: ', e.code
except URLError, e:
  print 'We failed to reach a server.Reason: ', e.reason
else:
  response=json.loads(result.read())
  print response
  result.close()

#判断SESSIONID是否在返回的数据中
if 'result' in response:
  auth_code=response['result']
else:
  print response['error']['data']
                                                                                          
# request json
#用得到的SESSIONID去通过验证,获取主机的信息(用http.get方法)
if len(auth_code) <> 0:
  host_list=[]
  get_host_data = json.dumps(
  {
    "jsonrpc":"2.0",
    "method":"host.get",
    "params":{
        "output": "extend",
    },
    "auth":auth_code,
    "id":1,
  })

  # create request object
  request = urllib2.Request(zabbix_url,get_host_data)
  for key in zabbix_header:
    request.add_header(key,zabbix_header[key])

  # get host list
  try:
    result = urllib2.urlopen(request)
  except URLError as e:
    if hasattr(e, 'reason'):
      print 'We failed to reach a server.'
      print 'Reason: ', e.reason
    elif hasattr(e, 'code'):
      print 'The server could not fulfill the request.'
      print 'Error code: ', e.code
  else:
    response = json.loads(result.read())
    result.close()                                                                                    
    #将所有的主机信息显示出来
    for r in response['result']:
    #  print r['hostid'],r['host']
      host_list.append(r['hostid'])
    #显示主机的个数
    print "Number Of Hosts: ", len(host_list)

  

#返回所有hostid==10251的主机,并只查询name包含“CPU Usage”字段的item,并按照name排序
  get_item_data = json.dumps({
    "jsonrpc": "2.0",
    "method": "item.get",
    "params": {
      "output": "extend",
      "hostids": "10251"
      "search": {
        #"key_": 'perf_counter[\Processor Information(_Total)\% Processor Time]'
        "name": "CPU Usage"
      },
      "sortfield": "name"
    },
    "auth": auth_code,
    "id": 1
  })

  request = urllib2.Request(zabbix_url,get_item_data)
  for key in zabbix_header:
    request.add_header(key,zabbix_header[key])
  result = urllib2.urlopen(request)

  try:
    result = urllib2.urlopen(request)  
    response = json.loads(result.read())
    for r in response['result']:
      print r['itemid'],r['hostid']
    result.close()  
  except:
    pass

  #通过hostid获取相应的graphid
  get_graph_data = json.dumps({
    "jsonrpc": "2.0",
    "method": "graphitem.get",
    "params": {
      "output": "extend",
      "expandData": 1,
      "itemids": "33712"
    },
    "auth": auth_code,
    "id": 1
  })
  request = urllib2.Request(zabbix_url,get_graph_data)
  for key in zabbix_header:
    request.add_header(key,zabbix_header[key])
  result = urllib2.urlopen(request)

  try:
    result = urllib2.urlopen(request)  
    response = json.loads(result.read())
    for r in response['result']:
      print r['itemid'],r['graphid']
    result.close()  
  except:
    pass

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python缩进区别分析
Feb 15 Python
python搭建服务器实现两个Android客户端间收发消息
Apr 12 Python
Sanic框架流式传输操作示例
Jul 18 Python
Python多进程池 multiprocessing Pool用法示例
Sep 07 Python
pandas每次多Sheet写入文件的方法
Dec 10 Python
20行python代码实现人脸识别
May 05 Python
Python可迭代对象操作示例
May 07 Python
Django模型序列化返回自然主键值示例代码
Jun 12 Python
pip安装python库的方法总结
Aug 02 Python
Python通过Pillow实现图片对比
Apr 29 Python
浅谈Python类的单继承相关知识
May 12 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
May 17 Python
使用Django2快速开发Web项目的详细步骤
Jan 06 #Python
利用Django提供的ModelForm增删改数据的方法
Jan 06 #Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
Jan 05 #Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
Jan 05 #Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
Jan 05 #Python
Python3爬虫全国地址信息
Jan 05 #Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
Jan 04 #Python
You might like
PHP5 面向对象(学习记录)
2009/12/02 PHP
php下通过curl抓取yahoo boss 搜索结果的实现代码
2011/06/10 PHP
php数组中删除元素的实现代码
2012/06/22 PHP
PHP编码规范的深入探讨
2013/06/06 PHP
php使用ob_start()实现图片存入变量的方法
2014/11/14 PHP
php实现保存周期为1天的购物车类
2017/07/07 PHP
js实现表格字段排序
2014/02/19 Javascript
JQuery用户名校验的具体实现
2016/03/18 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
VueJS全面解析
2016/11/10 Javascript
javascript中this用法实例详解
2017/04/06 Javascript
认识less和webstrom的less配置方法
2017/08/02 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
Angular实现模版驱动表单的自定义校验功能(密码确认为例)
2018/05/17 Javascript
layui table 参数设置方法
2018/08/14 Javascript
Vue使用Proxy监听所有接口状态的方法实现
2019/06/07 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
Vue 解决父组件跳转子路由后当前导航active样式消失问题
2020/07/21 Javascript
js实现自定义滚动条的示例
2020/10/27 Javascript
antd table按表格里的日期去排序操作
2020/11/17 Javascript
用实例说明python的*args和**kwargs用法
2013/11/01 Python
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
python中format()函数的简单使用教程
2018/03/14 Python
python按行读取文件,去掉每行的换行符\n的实例
2018/04/19 Python
pandas创建DataFrame的7种方法小结
2020/06/14 Python
Python设计密码强度校验程序
2020/07/30 Python
python实现KNN近邻算法
2020/12/30 Python
请解释流与文件有什么不同
2016/07/29 面试题
会计专业毕业生自我鉴定
2013/10/29 职场文书
高中毕业自我鉴定
2013/12/19 职场文书
《油菜花开了》教学反思
2014/02/22 职场文书
《冬阳童年骆驼队》教学反思
2014/04/15 职场文书
申论倡议书范文
2014/05/13 职场文书
经典演讲稿汇总
2014/05/19 职场文书
简述Java中throw-throws异常抛出
2021/08/07 Java/Android
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android