要写这篇博客其实我的内心是纠结的,老实说,我对zabbix的了解实在不多。但新公司的需求不容置疑,当我顶着有两个头大的脑袋懵懵转入运维领域时,面前摆着两百多组、上千台机器等着写入zabbix监控的需求(这种心境你们随意感受下就好),也尝试从网上查各种现成的资料,希望能找到解救自我的一些蛛丝马迹,然而发现大家在使用zabbix的时候都局限在“主机、查询组、模板的增删改查上”,甚至还贴心的封装成“类”以供调用。却不符合我要对Action进行配置的需求。几经挣扎,还是结合官网解释+自我臆测得到了想要的答案。最终实现了几百条action规则的批量创建,完成了自救。

zabbix  API简介

  为什么要调用zabbix API?

  zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案,随着zabbix在企业中被广泛的应用,Zabbix API开始扮演着越来越重要的角色,尤其是在集成第三方软件和自动化日常任务时。很难想象管理数千台服务器而没有自动化是多么的困难。Zabbix API为批量操作、第三方软件集成以及其他作用提供可编程接口。

  Zabbix API是在1.8版本中开始引进并且已经被广泛应用。所有的Zabbix移动客户端都是基于API,甚至原生的WEB前端部分也是建立在它之上。Zabbix API 中间件使得架构更加模块化也避免直接对数据库进行操作。它允许你通过JSON
RPC协议来创建、更新和获取Zabbix对象并且做任何你喜欢的操作【当然前提是你拥有认证账户】。

  Zabbix API提供两项主要功能:

    • 远程管理Zabbix配置

    • 远程检索配置和历史数据

  调用zabbix接口基本流程

  在zabbix调用zabbix接口的时候,需要带一个auth参数,这个auth参数需要先经过一次登录认证之后返回给客户端,然后客户端在请求的接口数据中需要带上这个auth字符串。具体的流程如下图:

  

以zabbix Action 开始的API调用旅程 

  zabbix Action简介

  上述简单的介绍一下zabbix API的用途,具体zabbix的架构或者深奥的底层代码在网上已经有很多介绍,但是针对“python调用zabbix接口实现对Action配置的批量操作”的介绍确非常少,而这又是我们在给大批量机器定制策略的时候要迈出的第一步,所以今天我们的重点放在用python实现zabbix接口调用上(代码,代码,代码)。一开始还觉得这篇博客写的内容有些狭隘了,但是谁能说一个姑娘讲述她那条泡泡纱裙子不是一种故事呢?所以最终一拍脑袋就决定这篇了~

  zabbix的接口功能非常强大、丰富,我在开篇已经说过现有网上资料的局限性,既然是以zabbix action的创建为题,还是要简单说一下zabbix的action(也就是zabbix报警)支持如下事件:

  • Trigger 触发器事件 - 触发器状态在OK和PROBLEM之间变化
  • Discovery 发现事件
  • Auto Registration 自动注册事件 - 新的客户端注册进来
  • Interval 内部事件 - item转变为unsupported状态,触发器转变为unknown状态

  调用接口数据格式说明

  在官网中已经有创建trigger和discovery action的例子,(zabbix3.0官网API地址:https://www.zabbix.com/documentation/3.0/manual/api/reference),我们今天主要谈谈建立Auto Registration所需要的接口数据,这在官网中并没有明确的列出,需要自己再加工一下,精简后的json数据如下:

 {
"jsonrpc": "2.0",
"method": "action.create",
"params": {
"name": name,
"eventsource": 2,
       "filter": {
          "conditions": [
{
"conditiontype": 24,
"operator":2,
"value": condition
},
]
},
"operations": [
{
"operationtype": 4,
"opgroup": [
{
"groupid": groupid
}
],
},
{
"operationtype": 6,
"optemplate": [
{
"templateid":10110
}
],
}
]
},
"auth": auth,
"id": 1
}

  下面一行一行来看:

  • "jsonrpc": "2.0"-这是标准的JSON RPC参数以标示协议版本,所有的请求都会保持不变。

  • "method": "action.create",这个参数定义了真实执行的操作(我们这里要进行的就是action的创建)。

  • "params": 这里通过传递JSON对象来作为特定方法的参数。

    • name   对应的就是action的name;
    • eventsource  条件类型,从官网上看来这是一个必要的条件;
    • filter  对应的是conditions中的条件,由于可以有多个条件,所以conditions是一个列表,每一个条件是一个字典;
    • operations  对应的就是Action operations也就是告警之后对应的操作,这里的operations也可以定义多条,所以是一个列表,每一个操作对应一个字典。
  • "id":1-这个字段用于绑定JSON请求和响应。响应会跟请求有相同的"id",在一次性发送多个请求时很有用,这些也不需要唯一或者连续。

  • "auth": "159121b60d19a9b4b55d49e30cf12b81"-这是一个认证令牌【authentication token】用以鉴别用户、访问API。这也是使用API进行相关操作的前提-获取认证ID。

API 使用

  明白了参数,去调用API的就非常简单了,所有不上代码的技术贴都是耍流氓~所以就直接上代码:

# - * -coding:utf-8 - * -
__author__ = 'Eva_J'
import json
import urllib2 def login():
data = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Eva_J",
"password": "~RdzvwqTSf"
},
"id": 0
}
response = request(data)
return response['result'] def request(data):
url = "http://monitor.dt.zw.ted/api_jsonrpc.php"
header = {"Content-Type": "application/json"}
data = json.dumps(data)
request = urllib2.Request(url,data)
for key in header:
request.add_header(key,header[key])
response = {}
try:
result = urllib2.urlopen(request)
except Exception as e:
print e
else:
response = json.loads(result.read())
result.close()
return response def getgroupId(auth,groupName):
data = {
"jsonrpc": "2.0",
"method": "hostgroup.get",
"params": {
"output": "extend",
"filter": {
"name":groupName
}
},
"auth": auth,
"id": 0
}
return request(data) def create(auth):
condition = u'codition name'
name = u"lottery-zookeeper"
groupid = 1 data = {
"jsonrpc": "2.0",
"method": "action.create",
"params": {
"name": name,
"eventsource": 2,
"filter": {
"evaltype": 0,
"conditions": [
{
"conditiontype": 24,
"operator":2,
"value": condition
},
]
},
"operations": [
{
"operationtype": 4,
"opgroup": [
{
"groupid": groupid
}
],
},
{
"operationtype": 6,
"optemplate": [
{
"templateid":10110
}
],
}
]
},
"auth": auth,
"id": 1
}
response = request(data)
return response def getGroupDic():
fileObj = open('group.txt','r')
groupsDic = {}
for line in fileObj:
lineLst = line.decode('GB2312').split('\t')
groupsDic[lineLst[1].strip('\n')] = lineLst[0]
return groupsDic if __name__ == '__main__':
auth = login()
response = create(auth)
print response

接口调用源码

  

python调用zabbix接口实现Action配置的更多相关文章

  1. 关于python调用zabbix api接口

    因公司业务需要,引进了自动化运维,所用到的监控平台为zbbix3.2,最近正在学习python,计划使用python调用zabbix api接口去做些事情,如生成报表,我想最基本的是要取得zabbix ...

  2. python调用ice接口

    今天用python调用ice接口,遇到如下提示 ImportError: No module named Ice 解决方案是 set PYTHONPATH=C:\Program Files\ZeroC ...

  3. python 调用RESTFul接口

    本周需要将爬虫爬下来的数据入库,因为之前已经写好PHP的接口的,可以直接通过python调用PHP接口来实现,所以把方法总结一下. //python编码问题,因为好久用,所以很容易出现 # -*- c ...

  4. Python调用API接口的几种方式 数据库 脚本

    Python调用API接口的几种方式 2018-01-08 gaoeb97nd... 转自 one_day_day... 修改 微信分享: 相信做过自动化运维的同学都用过API接口来完成某些动作.AP ...

  5. Python调用API接口的几种方式

    Python调用API接口的几种方式 相信做过自动化运维的同学都用过API接口来完成某些动作.API是一套成熟系统所必需的接口,可以被其他系统或脚本来调用,这也是自动化运维的必修课. 本文主要介绍py ...

  6. 利用python3 调用zabbix接口完成批量加聚合图形(screens)

    在上一篇博客中,我们完成的利用python3 调用zabbix接口批量增加主机,增加主机的item,增加主机的图形! 接下来我们完成批量增加主机的screen 首先我们要增加screen需要哪些参数呢 ...

  7. python 调用zabbix api接口实现主机的增删改查

    python程序调用zabbix系统的api接口实现对zabbix_server端主机的增删改查,使用相关功能时候,需要打开脚本中的相关函数. 函数说明: zabbixtools()  调用zabbi ...

  8. python调用RPC接口

    要调用RPC接口,python提供了一个框架grpc,这是google开源的 rpc相关文档: https://grpc.io/docs/tutorials/basic/python.html 需要安 ...

  9. python 调用zabbix api实现查询主机信息,输出所有主机ip

    之前发现搜索出来的主机调用zabbix api信息都不是那么明确,后来通过zabbix官方文档,查到想要的api信息,随后写一篇自己这次项目中用到的api. #!/usr/bin/env python ...

随机推荐

  1. DOM和DHTML等,复习总结

    DOM(Document Object Model),文件对象模型.HTML(HyperText Markup Language),超文本标记语言.HTML的超类:Node->Document: ...

  2. python 学习(二)--关于类

    1.没有权限控制,在类方法或变量前加 "__" 两下划线,则变为"私有"变量(实际通过_<类名>__<变量或方法名> 可以访问) 2.类 ...

  3. JQUERY PLUGIN:BARCODE条形码插件

    1)query.barcode.js安装 同其他jquery插件一样,只需要将jquery框架和jquery.barcode.js导入页面即可. <script type="text/ ...

  4. UITableView heightForHeaderInSection遇到的坑

    出现这种现象只需要把 heightforfoot改为0.01 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSectio ...

  5. 如何选择合适的CRM客户关系管理软件?

    面对日益激烈的市场竞争,很多企业管理者不断通过各种途径和方式,试图寻找一个合适并行之有效的解决方案,以帮助他们解决企业管理难题,不断提高企业的业绩,获得持续的成功. 企业管理软件的出现填补了企业管理领 ...

  6. ubuntu下安装JDK并搭建activeMQ

    1.安装JDK,网上有人说activeMQ支持持JDK1.7及以上版本,未实际测试,保险起见我这里直接安装JDK1.7. #apt-get install openjdk--jdk 2.设置环境变量 ...

  7. FireMonkey 保存图片到JPG的方法 BMP转JPG

    习惯VCL的做法了,到了FireMonkey里面,好像查不到单独的JPEG单元了,不少朋友就郁闷如何处理JPG了,这么大件事,不可能没有处理方法的,具体就请看代码: uses FMX.Surfaces ...

  8. nginx expires

    配置expiresexpires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求要配置expires,可以在http段中或者server段中或者location段中加入   1 ...

  9. Ubuntu学习小结(一)

    这段时间,抽空研究了一下Ubuntu,虽然也有过到目前为止使用计算机最作死的经历,但目前已经学会了一些最基本的操作.在这里简单的记录一下,算是吸取的教训,供其他人借鉴. 1.装Ubuntu系统.装Ub ...

  10. NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象

    摘要: NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的 ...