python調用zabbix接口實現Action配置

  要寫這篇博客其實個人心裏是糾結的,老實說,我對zabbix的瞭解實在很少。但新公司的需求無可置疑,當我頂着有兩個頭大的腦殼懵懵轉入運維領域時,面前擺着兩百多組、上千臺機器等着寫入zabbix監控的需求(這種心境大家隨意感覺下就好),也嘗試從網上查各類現成的資料,但願能找到解救自個人一些蛛絲馬跡,然而發現你們在使用zabbix的時候都侷限在「主機、查詢組、模板的增刪改查上」,甚至還貼心的封裝成「類」以供調用。卻不符合我要對Action進行配置的需求。幾經掙扎,仍是結合官網解釋+自我臆測獲得了想要的答案。最終實現了幾百條action規則的批量建立,完成了自救。php

zabbix  API簡介

  爲何要調用zabbix API?前端

  zabbix是一個基於WEB界面的提供分佈式系統監視以及網絡監視功能的企業級的開源解決方案,隨着zabbix在企業中被普遍的應用,Zabbix API開始扮演着愈來愈重要的角色,尤爲是在集成第三方軟件和自動化平常任務時。很難想象管理數千臺服務器而沒有自動化是多麼的困難。Zabbix API爲批量操做、第三方軟件集成以及其餘做用提供可編程接口。python

  Zabbix API是在1.8版本中開始引進而且已經被普遍應用。全部的Zabbix移動客戶端都是基於API,甚至原生的WEB前端部分也是創建在它之上。Zabbix API 中間件使得架構更加模塊化也避免直接對數據庫進行操做。它容許你經過JSON
RPC協議來建立、更新和獲取Zabbix對象而且作任何你喜歡的操做【固然前提是你擁有認證帳戶】。 數據庫

  Zabbix API提供兩項主要功能:編程

    • 遠程管理Zabbix配置json

    • 遠程檢索配置和歷史數據api

  調用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
接口調用源碼
相關文章
相關標籤/搜索