最近有個想法:想做一個zabbix數據的二次呈現,所以來寫一下Zabbix的api的內容。
先說下zabbix api的認證基礎。
Zabbix API簡介
Zabbix API開始扮演着越來越重要的角色,尤其是在集成第三方軟件和自動化日常任務時。。Zabbix API為批量操作、第三方軟件集成以及其他作用提供可編程接口。
Zabbix API是在1.8版本中開始引進並且已經被廣泛應用。所有的Zabbix移動客戶端都是基於API,甚至原生的WEB前端部分也是建立在它之上。Zabbix API 中間件使得架構更加模塊化也避免直接對數據庫進行操作。它允許你通過JSON
RPC協議來創建、更新和獲取Zabbix對象並且做任何你喜歡的操作。
Zabbix API提供兩項主要功能:
- 遠程管理Zabbix配置
- 遠程檢索配置和歷史數據
使用JSON
API 采用JSON-RPC實現。這意味着調用任何函數,都需要發送POST請求,輸入輸出數據都是以JSON格式。大致工作流如下:
-
准備JSON對象,它描述了你想要做什么(創建主機,獲取圖像,更新監控項等)。
-
采用POST方法向 http://example.com/zabbix/api_jsonrpc.php發送此JSON對象,http://example.com/zabbix/是Zabbix前端地址 ,api_jsonrpc.php是調用API的PHP腳本。可在安裝可視化前端的目錄下找到。
-
獲取JSON格式響應。
-
注:請求除了必須是POST方法之外,HTTP Header Content-Type必須為【application/jsonrequest,application/json-rpc,application/json】其中之一。
可以采用腳本或者任何"手動"支持JSON RPC的工具來使用API。而首先需要了解的就是如何驗證和如何使用驗證ID來獲取想要的信息。后面的演示會以Python腳本和基於Curl的例子來呈現API的基本使用。
基本請求格式
Zabbix API 簡化的JSON請求如下:
1 { 2 "jsonrpc": "2.0", 3 "method": "method.name", 4 "params": { 5 "param_1_name": "param_1_value", 6 "param_2_name": "param_2_value" 7 }, 8 "id": 1, 9 "auth": "159121b60d19a9b4b55d49e30cf12b81", 10 }
下面一行一行來看:
-
"jsonrpc": "2.0"-這是標准的JSON RPC參數以標示協議版本。所有的請求都會保持不變。
-
"method": "method.name"-這個參數定義了真實執行的操作。例如:host.create、item.update等等
-
"params"-這里通過傳遞JSON對象來作為特定方法的參數。如果你希望創建監控項,"name"和"key_"參數是需要的,每個方法需要的參數在Zabbix API文檔中都有描述。
-
"id": 1-這個字段用於綁定JSON請求和響應。響應會跟請求有相同的"id"。在一次性發送多個請求時很有用,這些也不需要唯一或者連續
-
"auth": "159121b60d19a9b4b55d49e30cf12b81"-這是一個認證令牌【authentication token】用以鑒別用戶、訪問API。這也是使用API進行相關操作的前提-獲取認證ID。
API 使用
- 環境准備
Zabbix API是基於JSON-RPC 2.0規格,具體實現可以選擇任何你喜歡的編程語言或者手動方式。這里我們采用的Python和基於Curl的方式來做示例。Python 2.7版本已經支持JSON,所以不再需要其他模塊組件。當然可以采用Perl、Ruby、PHP之類的語言,使用前先確保相應JSON模塊的安裝。
- 身份驗證
任何Zabbix API客戶端在真正工作之前都需要驗證它自身。在這里是采用User.login方法。這個方法接受一個用戶名和密碼作為參數並返回驗證ID,一個安全哈希串用於持續的API調用(在使用User.logout之前該驗證ID均有效)。
認證獲取簡例
1. user.login方法獲取zabbix server的認證結果官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/user/login
python腳本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
[iyunv@yang python]# cat auth.py #!/usr/bin/env python2.7 #coding=utf-8 import json import urllib2 # based url and required header url = "http://1.1.1.1/zabbix/api_jsonrpc.php" header = {"Content-Type":"application/json"} # auth user and password data = json.dumps( { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "zabbix" }, "id": 0 }) # create request object request = urllib2.Request(url,data) for key in header: request.add_header(key,header[key]) # auth and get authid try: result = urllib2.urlopen(request) except URLError as e: print "Auth Failed, Please Check Your Name AndPassword:",e.code else: response = json.loads(result.read()) result.close() print"Auth Successful. The Auth ID Is:",response['result'] |
python腳本運行結果:
1 2 |
[iyunv@yang python]# python auth.py Auth Successful. The Auth ID Is: a0b82aae0842c2041386a61945af1180 |
curl命令:
1 2 3 |
curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc": "2.0","method":"user.login","params":{"user":"admin","password":"zabbix"},"auth": null,"id":0}' http://1.1.1.1/zabbix/api_jsonrpc.php |
curl命令運行結果:
1 | {"jsonrpc":"2.0","result":"b895ce91ba84fe247e444817c6773cc3","id":0} |
比較來看,采用腳本可以有更多的靈活性,而基於CURL的方式,對結果的處理不是很方便。原理則都是相通的。
除了這些獲取信息以外,采用API調用同樣可以進行創建操作,更新操作和刪除操作等等。這也很容易讓我們聯想起數據庫操作,當然比較這些采用API
調用獲取結果的方式,也不能忘掉這種最直接而危險的方式。在開始討論中已經提到,Zabbix現在自帶的前端實現部分是采用數據庫操作,部分是基於API
調用。
API調用數據流程
- 數據流程
下面的流程圖代表了Zabbix API
工作的典型工作流。驗證(方法user.login)是獲取驗證ID的強制步驟。這個ID又允許我們調用API提供的任何權限允許的方法來進行操作。在之
前的例子中沒有提到user.logout方法,這也是一次驗證ID能夠重復使用的原因所在。使用user.logout方法后將會使驗證ID失效,后面
的操作將不能再使用此ID。
from:http://www.cnblogs.com/yangliheng/p/6394573.html