要寫這篇博客其實個人心裏是糾結的,老實說,我對zabbix的瞭解實在很少。但新公司的需求無可置疑,當我頂着有兩個頭大的腦殼懵懵轉入運維領域時,面前擺着兩百多組、上千臺機器等着寫入zabbix監控的需求(這種心境大家隨意感覺下就好),也嘗試從網上查各類現成的資料,但願能找到解救自個人一些蛛絲馬跡,然而發現你們在使用zabbix的時候都侷限在「主機、查詢組、模板的增刪改查上」,甚至還貼心的封裝成「類」以供調用。卻不符合我要對Action進行配置的需求。幾經掙扎,仍是結合官網解釋+自我臆測獲得了想要的答案。最終實現了幾百條action規則的批量建立,完成了自救。php
爲何要調用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簡介架構
上述簡單的介紹一下zabbix API的用途,具體zabbix的架構或者深奧的底層代碼在網上已經有不少介紹,可是針對「python調用zabbix接口實現對Action配置的批量操做」的介紹確很是少,而這又是咱們在給大批量機器定製策略的時候要邁出的第一步,因此今天咱們的重點放在用python實現zabbix接口調用上(代碼,代碼,代碼)。一開始還以爲這篇博客寫的內容有些狹隘了,可是誰能說一個姑娘講述她那條泡泡紗裙子不是一種故事呢?因此最終一拍腦殼就決定這篇了~
zabbix的接口功能很是強大、豐富,我在開篇已經說過現有網上資料的侷限性,既然是以zabbix action的建立爲題,仍是要簡單說一下zabbix的action(也就是zabbix報警)支持以下事件:
調用接口數據格式說明
在官網中已經有建立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對象來做爲特定方法的參數。
"id":1-這個字段用於綁定JSON請求和響應。響應會跟請求有相同的"id",在一次性發送多個請求時頗有用,這些也不須要惟一或者連續。
明白了參數,去調用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