要写这篇博客其实我的内心是纠结的,老实说,我对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调用ice接口

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

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

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

  3. Python调用服务接口

    #! /usr/bin/env python # coding=utf-8 ############################################################## ...

  4. 【Python】 docker-py 用Python调用Docker接口

    [docker-py] 官方文档:[https://docker-py.readthedocs.io/en/stable/images.html] 众所周知,Docker向外界提供了一个API来管理其 ...

  5. Python调用HTTP接口并传递cookie

    #get接口调用 import urllib import urllib2 get_url = "http://10.10.3.63/test?id=123&name=nba&quo ...

  6. 用Python写WebService接口并且调用

    一.用ladon框架封装Python为Webservice接口 另用soaplib实现请看:    http://www.jianshu.com/p/ad3c27d2a946 功能实现的同时,希望将接 ...

  7. python实现微信接口(itchat)

    python实现微信接口(itchat) 安装 sudo pip install itchat 登录 itchat.auto_login() 这种方法将会通过微信扫描二维码登录,但是这种登录的方式确实 ...

  8. WebApi接口 - 如何在应用中调用webapi接口

    很高兴能再次和大家分享webapi接口的相关文章,本篇将要讲解的是如何在应用中调用webapi接口:对于大部分做内部管理系统及类似系统的朋友来说很少会去调用别人的接口,因此可能在这方面存在一些困惑,希 ...

  9. C#动态调用WCF接口,两种方式任你选。

    写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项目时用到了WCF. 从这 ...

随机推荐

  1. css3盒模型

    css2.1盒模型: 当你定义盒子的宽高后:如果添加padding和border值后盒子的宽高会被撑大 盒子的高度=定义的高度+(padding-top + padding-bottom)+(bord ...

  2. Intellij Idea/Webstorm/Phpstorm 版本控制忽略文件

    本地差异化配置,不需要提交,这时候需要在整个版本控制中忽略掉文件的提交. File -> Settings -> Version Control -> Ignored Files

  3. ViewBag 找不到编译动态表达式所需的一种或多种类型,是否缺少引用?

    症状: 类似上面的警告提示,运行程序不会有任何错误,但若干地方都提示警告,并且明明dll的引用都是正确的. 解决方案: 删除:C:\Users\{your computer name}\AppData ...

  4. css实现 当鼠标移到input的时候,input框出现阴影,当移动到button的时候,input框的阴影消失,button框出现阴影

    <meta charset="utf-8" /> <style type="text/css"> div{overflow: hidde ...

  5. GET方法和POST方法

    package com.hanqi.cunchu; import android.app.ProgressDialog; import android.support.v7.app.AppCompat ...

  6. bzoj2441 小W的问题

    bzoj2441 按照纵坐标排序,从小到大插入数列中,每个点i维护一个data[i]表示未插入序列中横坐标小于i的数的个数(用线段树)其实点i就是“W”中第一个极小点,那么f[j]就等于1到j-1中所 ...

  7. RobotFramework - 在Window7系统中安装本地RobotFrmamework自动化测试环境

    RIDE Installation 安装顺序:Python ---> setuptools & pip ---> Robot Framewok ---> wxPython(v ...

  8. 用pywinauto进行win32应用程序的测试

    之前做win32应用测试时,用过很多大家耳熟成详的工具,接触pywinauto之前,对它的了解也不多,然而,随着对它了解的增多,发现它借助了python动态对象的能力,使得代码即便于书定,也便于阅读, ...

  9. Java中UIManager的几种外观的详细讲解

    Java'中的几种Look and Feel 1.Metal风格 (默认) String lookAndFeel = "javax.swing.plaf.metal.MetalLookAnd ...

  10. Adobe Flash Builder 4.6破解方法

    http://hi.baidu.com/cm186man/blog/item/148658ce557c0323b700c853.html 1.到Adobe官网下载FlashBuilder 4.6,有简 ...