ZABBIX API簡介及使用


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 RPC的工具來使用API。而首先需要了解的就是如何驗證和如何使用驗證ID來獲取想要的信息。后面的演示會以Python腳本和基於Curl的例子來呈現API的基本使用。

基本請求格式

Zabbix API 簡化的JSON請求如下:

{
    "jsonrpc": "2.0",
    "method": "method.name", 
    "params": {
        "param_1_name": "param_1_value",
        "param_2_name": "param_2_value" 
    },
    "id": 1,
    "auth": "159121b60d19a9b4b55d49e30cf12b81",
}

下面一行一行來看:

  • "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均有效)。具體Python代碼auth.py如下:

#!/usr/bin/env python2.7
#coding=utf-8
import json
import urllib2
# based url and required header
url = "http://monitor.example.com/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 And Password:",e.code
else:
    response = json.loads(result.read())
    result.close()
    print "Auth Successful. The Auth ID Is:",response['result']

這里需要確保URL中的用戶名和密碼匹配。下面是運行結果:

picture1

可以看到,auth.py成功連接並認證。現在有了驗證ID,它能夠在新的API調用中被重用。

下面再來看基於CURL的方式來進行驗證是如何實現的:

curl -i -X POST -H 'Content-Type:application/json' -d'{"jsonrpc": "2.0","method":"user.authenticate","params":{"user":"Admin","password":"zabbix"},"auth": null,"id":0}' http://monitor.example.com/api_jsonrpc.php

picture2

  • 一般操作

這里舉例說明如何獲取監控主機列表【host list】。這段腳本需要采用auth.py中獲取的驗證ID並執行host.get方法來獲取主機列表。來看具體代碼get_host.py:

#!/usr/bin/env python2.7
#coding=utf-8
import json
import urllib2
# based url and required header
url = "http://monitor.example.com/api_jsonrpc.php"
header = {"Content-Type": "application/json"}
# request json
data = json.dumps(
{
    "jsonrpc":"2.0",
    "method":"host.get",
    "params":{
        "output":["hostid","name"],
        "filter":{"host":""}
    },
    "auth":"2ee379e516f386ca4c24da7fd9fd5bb4", # the auth id is what auth script returns, remeber it is string
    "id":1,
})
# create request object
request = urllib2.Request(url,data)
for key in header:
    request.add_header(key,header[key])
# get host list
try:
    result = urllib2.urlopen(request)
except URLError as e:
    if hasattr(e, 'reason'):
        print 'We failed to reach a server.'
        print 'Reason: ', e.reason
    elif hasattr(e, 'code'):
        print 'The server could not fulfill the request.'
        print 'Error code: ', e.code
else:
    response = json.loads(result.read())
    result.close()
    print "Number Of Hosts: ", len(response['result'])
    for host in response['result']:
        print "Host ID:",host['hostid'],"Host Name:",host['name']

 

部分結果列表:

picture3

對比基於CURL的訪問方式: curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","method":"host.get","params":{"output":["hostid","name"],"filter":{"host":""}},"auth":"ecc543db662930c122b5fbedee60cc63","id":1}' http://monitor.example.com/api_jsonrpc.php

picture4

結果太多,未予顯示。比較來看,采用腳本可以有更多的靈活性,而基於CURL的方式,對結果的處理不是很方便。原理則都是相通的。

除了這些獲取信息以外,采用API調用同樣可以進行創建操作,更新操作和刪除操作等等。這也很容易讓我們聯想起數據庫操作,當然比較這些采用API調用獲取結果的方式,也不能忘掉這種最直接而危險的方式。在開始討論中已經提到,Zabbix現在自帶的前端實現部分是采用數據庫操作,部分是基於API調用。在API還不是很成熟的現在,具體采用哪種方式,需要根據業務需求再來確定。

  • 數據流程

下面的流程圖代表了Zabbix API 工作的典型工作流。驗證(方法user.login)是獲取驗證ID的強制步驟。這個ID又允許我們調用API提供的任何權限允許的方法來進行操作。在之前的例子中沒有提到user.logout方法,這也是一次驗證ID能夠重復使用的原因所在。使用user.logout方法后將會使驗證ID失效,后面的操作將不能再使用此ID。

picture5

 

ref: 

 

原文地址: http://paperplane.ruhoh.com/zabbix/intro-to-zabbix-api/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM