Zabbix API 簡介
Zabbix API 開始扮演着愈來愈重要的角色,尤爲是在集成第三方軟件和自動化平常任務時。
很難想象管理數千臺服務器而沒有自動化是多麼的困難。
Zabbix API 爲批量操做、第三方軟件集成以及其餘做用提供可編程接口。
Zabbix API 是在 1.8 版本中開始引進而且已經被普遍應用。全部的 Zabbix 移動客戶端都是基於 API,
甚至原生的 WEB 前端部分也是創建在它之上。
Zabbix API 中間件使得架構更加模塊化也避免直接對數據庫進行操做。
它容許你經過 JSON RPC 協議來建立、更新和獲取 Zabbix 對象而且作任何你喜歡的操做【固然前提是你擁有認證帳戶】。
Zabbix API 提供兩項主要功能:
1. 遠程管理 Zabbix 配置
2. 遠程檢索配置和歷史數據
使用 JSON
API 採用 JSON-RPC 實現。這意味着調用任何函數,都須要發送 POST 請求,輸入輸出數據都是以 JSON 格式。
Zabbix API 的使用流程
使用 API 的基本步驟
- 鏈接 http://x.x.x.x/api_jsonrpc.php 提供用戶名和密碼,
並標識 HTTP 頭部 Content-Type:application/json,HTTP 方法爲 POST。
- 獲取 SESSIONID
- 經過 SESSIONID 創建後續的鏈接
- 提交 POST 數據,格式爲 JSON,其中放對應的方法,獲取須要的數據。
三、格式及參數說明php
zabbix-api的json格式主要包括如下內容:html
jsonrpc - API使用的JSON-RPC協議的版本; Zabbix API實現JSON-RPC版本2.0;前端
method - 調用的API方法;node
params - 將被傳遞給API方法的參數;python
auth -用戶認證令牌;linux
id - 請求的任意標識符;算法
zabbix表結構sql
hosts主要表結構和各字段的意思數據庫
hostid 主機ID/模版ID readonly編程
proxy_hostid 代理主機ID,即這臺主機經過該代理主機去監控
host 主機名,監控agent端ID字段
status 主機狀態
0 已啓用,監視這臺主機
1 停用的,不監視這臺主機
3 模版
5 主動模式 建立代理時使用
6 被動模式 建立代理時使用
available 客戶端agent主機是否可用 readonly
0 未知或模版
1 可用
2 不可用
description 描述主機
disable_until 下一次輪詢一個不可用主機的時間,默認只讀readonly
ipmi_authtype 認證算法
-1 默認
0 無
1 MD2
2 MD5
4 Straight
5 OEM
6 RMCP+
ipmi_privilege 特權級別
1 回調
2 用戶 默認
3 操做者
4 管理者
5 OEM
ipmi_available 可用的ipmiagent
0 未知
1 可用
2 不可用
ipmi_disable_until ipmi不可用時下一次的輪詢時間
ipmi_error ipmi不可用的錯誤信息
ipmi_errors_from ipmi不可用狀態從何時開始
ipmi_password ipmi 密碼
ipmi_username ipmi用戶名
jmx_available 可用的jmxagent
0 未知
1 可用
2 不可用
jmx_disable_until 當jmx不可用時下一次輪詢當時間
jmx_error jmx不可用錯誤信息
jmx_errors_from jmx 不可用狀態開始時間
maintenance_from 資產維護開始時間
maintenance_status 生效當狀態
0 不維護
1 維護生效
maintenance_type 生效維護的類型
0 經過數據收集維護 默認
1 非數據收集維護
maintenanceid 維護的ID,若是當前主機處於維護狀態,不然爲null
snmp_available snmp是否可用
0 未知
1 可用
2 不可用
snmp_disable_until 當snmp不可用時下一次輪詢時間
snmp_error 不可用時錯誤信息
snmp_errors_from 錯誤開始時間
error 當agent不可用時顯示當錯誤信息
error_from 故障時間 當agent不可用時開始的時間
name 主機顯示的名稱,便可見名稱,默認是用host字段是值填充
flags 主機來源
0 表示普通的主機
4 表示自動發現的主機
inventory_mode 主機資產類型
-1 禁用
0 手動,默認值
自動
監控項items
itemid 監控項ID
type 監控項類型
0 Zabbix 客戶端,
1 SNMPv1 客戶端,
2 Zabbix採集器,
3 簡單檢查,
4 SNMPv2 客戶端,
5 Zabbix內部,
6 SNMPv3 客戶端,
7 Zabbix客戶端(主動式),
8 Zabbix整合,
10 外部檢查,
11 數據庫監控,
12 IPMI客戶端,
13 SSH 客戶端,
14 TELNET客戶端,
15 可計算的,
16 JMX agent代理程序,
17 SNMP trap
hostid 關聯主機ID
name 監控項名稱
key_ 監控項key值
delay 間隔/秒
history 歷史數據保留時間/天
trends 趨勢數據保留時間/天 默認365天
status 監控項啓用狀態
0 啓用
1 禁用
value_type 數據類型,對應的存放歷史數據表
0 history表 numeric float
1 history_str表 character
2 history_log表 log
3 history_uint表 numeric unsigned
4 history_text表 text
authtype ssh認證方法,只有經過ssh代理方式時使用
0 密碼
1 public key
units 數據類型單位
data_type 數據類型
0 decimal 十進制
1 octal 八進制
2 hexadecimal 十六進制
3 boolean 布爾
delay_flex 自定義間隔
delta 存儲的值
0 (default) as is
1 Delta, speed per second
2 Delta, simple change
error 若是監控項有問題會自動更新這個錯誤信息 readonly
history 監控項保持的歷史數據時長,默認90天,單位天
formula 公式,自定義乘數
1 默認值
lastclock 監控項最後一次更新時間
logtimefmt 格式化日誌時間
templateid 監控項對應的父模版ID,該ID自關聯,模版對應的爲hostid至關於模版分組
flags 監控項來源
0 普通
4 自動發現
interfaceid 網卡IP,對應interface表interfaceid
params 額外的參數類型取決於監控項
針對ssh和telnet監控項 執行腳本
數據庫監控項 執行sql
計算類型 執行公式
port 針對snmp監控項,端口監控
password 密碼認證,針對簡單檢查,ssh,telnet,數據庫監視,jmx監控項
description 監控項描述信息
state 該監控項是否適用
0 支持
1不支持
用 curl 模擬 API 的使用
# 1. 獲取 SESSIONID [root@linux-node1 ~]# curl -s -X POST -H 'Content-Type:application/json' -d ' > { > "jsonrpc": "2.0", > "method": "user.login", > "params": { > "user": "Admin", > "password": "zabbix" > }, > "id": 1 > }' http://192.168.56.11/zabbix/api_jsonrpc.php | python -m json.tool { "id": 1, "jsonrpc": "2.0", "result": "6a0d235908c25a495f0d356157fbb3d3" } # 2. 用獲取的 SESSIONID 去調用 API 的 host.get 方法請求 hostid [root@linux-node1 ~]# curl -s -X POST -H 'Content-Type:application/json' -d ' > { > "jsonrpc": "2.0", > "method": "host.get", > "params": { > "output": ["hostid"] > }, > "auth": "6a0d235908c25a495f0d356157fbb3d3", > "id": 1 > }' http://192.168.56.11/zabbix/api_jsonrpc.php | python -m json.tool { "id": 1, "jsonrpc": "2.0", "result": [ { "hostid": "10084" }, { "hostid": "10120" } ] }
能夠經過 API 來添加和刪除 Host,這裏就不舉例了,具體方法參考官網文檔。
在實際的 API 開發應用中,咱們能夠採用 Python 等其餘編程語言中來實現。 以下,就是用 Python 寫的用於認證獲取 SESSIONID 的代碼例子:
#!/usr/bin/env python # -*- coding:utf-8 -*- import requests import json url = 'http://192.168.56.11/zabbix/api_jsonrpc.php' post_data = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "zabbix" }, "id": 1 } post_header = {'Content-Type': 'application/json'} ret = requests.post(url, data=json.dumps(post_data), headers=post_header) zabbix_ret = json.loads(ret.text) if not zabbix_ret.has_key('result'): print 'login error' else: print zabbix_ret.get('result')
執行腳本時,注意要安裝 Python requests 模塊。
[root@linux-node1 ~]# python zabbix_auth.py Traceback (most recent call last): File "zabbix_auth.py", line 4, in <module> import requests ImportError: No module named requests [root@linux-node1 ~]# yum install python-pip -y [root@linux-node1 ~]# pip install requests [root@linux-node1 ~]# python zabbix_auth.py f2453c4cc730d5158a87e0754940138e
調用Zabbix api使用的是HTTP的POST請求方式
其中請求的頭部爲:
請求的URL爲:
若是url中包含目錄須要把目錄寫上,如http://zabbix.aek.com/zabbix/api_jsonrpc.php,最後就是請求的數據(data),好比獲取Token,建立主機,獲取主機ID,獲取模板ID,獲取組ID,刪除主機等。
接下以以Python調用 API爲例,例出用法案例:
測試鏈接是否成功
上面的data用來測試是否可鏈接成功,官方文檔中auth的值爲null,但在python中null用None表示,因此須要改爲None。
成功後返回值大概以下:會顯示zabbix版本
獲取Token
成功後返回值以下:會返回一個Token
最後以一個完整的Python腳本經過zabbix API獲取全部主機的信息爲例:
經過以上的學習相信你們對Zabbix API已經有一個初步的認識,後面將會經過API去完成主機的自動添加,自動化報表等使用
python3(requests)調用zabbix-4.2.3-api添加修改主機
自動化是需求,手動太慢,自動發現沒玩過。用的比較多的就是調API來操做。
zabbix版本爲4.2.3 python3 須要reuquests,json模塊
下面是代碼,只寫了添加和刪除的功能,有需求的能夠本身加一下
'''
2019.6.19
zabbix API 修改主機
'''
import json,requests
headers={"Content-Type":"application/json"}
url = 'http://www.zabbix.com/zabbix/api_jsonrpc.php'
def getAuth(user,password):
try:
global headers, url
data = json.dumps({
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": user,
"password": password
},
"id": 1,
})
res = requests.post(url,data=data,headers=headers)
auth = res.json().get('result','')
return auth
except Exception as err:
pass
def getHost(auth):
try:
global headers,url
data = json.dumps({
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": [
"hostid",
"host"],
"selectInterfaces": [
"interfaceid",
"ip"]},
"id": 2,
"auth": auth
})
res = requests.post(url,data=data,headers=headers)
host = res.json()
return host
except:
pass
def getGroupid(auth,groupname):
try:
global headers, url
data = json.dumps({
"jsonrpc": "2.0",
"method": "hostgroup.get",
"params": {
"output": "extend",
"filter": {
"name": [groupname]}},
"auth": auth,
"id": 1
})
res = requests.post(url,data=data,headers=headers)
groupid = res.json()['result'][0]['groupid']
return groupid
except:
pass
def getTempid(auth,tempname):
try:
global headers, url
# print(templist)
data = json.dumps(
{
"jsonrpc": "2.0",
"method": "template.get",
"params": {
"output": "extend",
"filter": {
"host": tempname}},
"auth": auth,
"id": 1}
)
res = requests.post(url,data=data,headers=headers)
tempid = []
for i in range(len(res.json()['result'])):
id = res.json()['result']