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 字符串split的用法分享
Mar 23 Python
使用django-crontab实现定时任务的示例
Feb 26 Python
Python实现简单石头剪刀布游戏
Jan 20 Python
Python发展简史 Python来历
May 14 Python
解决django同步数据库的时候app models表没有成功创建的问题
Aug 09 Python
解决python中的幂函数、指数函数问题
Nov 25 Python
python中设置超时跳过,超时退出的方式
Dec 13 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
Jan 24 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
Feb 20 Python
Tkinter中复选菜单是否被选中的判断与设置方式
Mar 04 Python
基于python实现FTP文件上传与下载操作(ftp&amp;sftp协议)
Apr 01 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
Nov 29 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
php checkbox复选框值的获取与checkbox默认值输出方法
2010/05/15 PHP
非常好用的两个PHP函数 serialize()和unserialize()
2012/02/04 PHP
php二维数组转成字符串示例
2014/02/17 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
收藏一些不常用,但是有用的代码
2007/03/12 Javascript
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
javascript 自动填写表单的实现方法
2010/04/09 Javascript
WEB 浏览器兼容 推荐收藏
2010/05/14 Javascript
Js如何判断客户端是PC还是手持设备简单分析
2012/11/22 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
2014/10/16 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
2014/10/17 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
基于JavaScript实现无限加载瀑布流
2017/07/21 Javascript
微信小程序实现折叠面板
2018/01/31 Javascript
微信小程序开发实现的IP地址查询功能示例
2019/03/28 Javascript
node中使用log4js4.x版本记录日志的方法
2019/08/20 Javascript
vue中axios防止多次触发终止多次请求的示例代码(防抖)
2020/02/16 Javascript
Python 网络编程起步(Socket发送消息)
2008/09/06 Python
python中list常用操作实例详解
2015/06/03 Python
linux中如何使用python3获取ip地址
2019/07/15 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
英国第一豪华护肤品牌:Elemis
2017/10/12 全球购物
测绘工程个人的自我评价
2013/11/23 职场文书
人力资源部副职的竞聘演讲稿
2014/01/07 职场文书
公司贷款承诺书
2014/05/30 职场文书
北京奥运会口号
2014/06/21 职场文书
机关干部作风建设剖析材料
2014/10/23 职场文书
个人作风纪律整顿整改措施
2014/10/25 职场文书
2015年校长新年寄语
2014/12/08 职场文书
毕业赠语大全
2015/06/23 职场文书
爱护环境建议书
2015/09/14 职场文书
省级三好学生主要事迹材料
2015/11/03 职场文书
2019暑期安全倡议书!
2019/06/27 职场文书
MySQL 用 limit 为什么会影响性能
2021/09/15 MySQL
Go归并排序算法的实现方法
2022/04/06 Golang
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android