天天看點

018-zabbix_apiZabbix API 簡介Zabbix API 的使用流程python3(requests)調用zabbix-4.2.3-api添加修改主機

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 的基本步驟

  1. 連接配接 http://x.x.x.x/api_jsonrpc.php 提供使用者名和密碼,

    并辨別 HTTP 頭部 Content-Type:application/json,HTTP 方法為 POST。

  2. 擷取 SESSIONID
  3. 通過 SESSIONID 建立後續的連接配接
  4. 送出 POST 資料,格式為 JSON,其中放對應的方法,擷取需要的資料。

3、格式及參數說明

zabbix-api的json格式主要包括以下内容:

jsonrpc - API使用的JSON-RPC協定的版本; Zabbix API實作JSON-RPC版本2.0;

method - 調用的API方法;

params - 将被傳遞給API方法的參數;

auth -使用者認證令牌;

id - 請求的任意辨別符;

zabbix表結構

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

[[email protected] ~]# 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 [[email protected] ~]# 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 子產品。

[[email protected] ~]# python zabbix_auth.py
Traceback (most recent call last):
  File "zabbix_auth.py", line 4, in <module> import requests ImportError: No module named requests [[email protected] ~]# yum install python-pip -y [[email protected] ~]# pip install requests [[email protected] ~]# 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為例,例出用法案例:

測試連接配接是否成功

#!/usr/bin/python
#coding:utf:8

import requests
import json url = "http://zabbix.aek.com/zabbix/api_jsonrpc.php" header = {"Content-Type": "application/json-rpc"} data = {"jsonrpc":"2.0","method":"apiinfo.version","id":1,"auth":None,"params":{}} request = requests.post(url=url, headers=header, data=json.dumps(data)) print(request.content)                

上面的data用來測試是否可連接配接成功,官方文檔中auth的值為null,但在python中null用None表示,是以需要改成None。

成功後傳回值大概如下:會顯示zabbix版本

擷取Token

#!/usr/bin/python
#coding:utf:8

import requests
import json url = "http://zabbix.aek.com/zabbix/api_jsonrpc.php" header = {"Content-Type": "application/json-rpc"} data = {"jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "zabbix" }, "id": 1, "auth": None } request = requests.post(url=url, headers=header, data=json.dumps(data)) print(request.content)                

成功後傳回值如下:會傳回一個Token

最後以一個完整的Python腳本通過zabbix API擷取所有主機的資訊為例:

#!/usr/bin/python
#coding:utf:8

import requests
import json class Zabbix: def __init__(self, url, header, username, password): self.url = url self.header = header self.username = username self.password = password def getToken(self): #擷取Token并傳回字元Token字元串 data = {"jsonrpc": "2.0", "method": "user.login", "params": { "user": self.username, "password": self.password }, "id": 1, "auth": None } token = requests.post(url=self.url, headers=self.header, data=json.dumps(data)) return json.loads(token.content)["result"] def getAllHost(self): #擷取所有主機資訊 data = {"jsonrpc": "2.0", "method": "host.get", "params": { "output": [ "hostid", "host", ], "selectGroups": "extend", "selectInterfaces": [ "interfaceid", "ip" ] }, "id": 2, "auth": self.getToken() } hosts = requests.post(url=self.url, headers=self.header, data=json.dumps(data)) return json.loads(hosts.content)["result"] if __name__ == "__main__": header = {"Content-Type": "application/json-rpc"} url="http://zabbix.aek.com/zabbix/api_jsonrpc.php" test = Zabbix(url=url, header=header, username="Admin", password="zabbix") print(test.getAllHost())                

通過以上的學習相信大家對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(

轉載于:https://www.cnblogs.com/xuefy/p/11413703.html