1. 程式人生 > >python3 呼叫zabbix API實現批量增加刪除主機,主機各種監控項------實戰

python3 呼叫zabbix API實現批量增加刪除主機,主機各種監控項------實戰

在以前的部落格中談到了利用zabbix介面來對主機進行批量的增刪改查

這裡在不用環境中實戰遇到了不同問題,這裡記錄下來以便後續review

以下為實戰中獲取token的程式碼,在zabbix標準介面文件中  寫道 

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1

但是由於部署的方式不同 在生產環境中   

http://XXX/api_jsonrpc.php 應該是這個地址(這裡卡了很久 由於不是本人部署)
import requests
import json
def getToken():
    url 
= 'http://XXX/api_jsonrpc.php' headers = {'Content-Type': 'application/json'} auth = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "XXXXX", ###驗證 "password": "XXXXX#123" }, "id": 1, "auth": None } response
= requests.post(url, data=json.dumps(auth), headers=headers) authid = json.loads(response.text)['result'] ### auth的id 也就是token print(authid) getToken()

結果如下獲取到token

  獲取到token之後由於需要批量加聚合圖形,所以我們先看下加聚合圖形需要那些引數   https://www.zabbix.com/documentation/3.4/zh/manual/api/reference/screen/create

{
    "jsonrpc": "2.0",
    "method": "screen.create",
    "params": {
        "name": "Graphs",
        "hsize": 3,
        "vsize": 2,
        "screenitems": [
            {
                "resourcetype": 0,
                "resourceid": "612",
                "rowspan": 0,
                "colspan": 0,
                "x": 0,
                "y": 0
            }
        ]
    },
    "auth": "038e1d7b1735c6a5436ee9eae095879e",
    "id": 1
}

上圖是一個典型的request,其中 jsonrpc method 數固定的 

hsize:水平尺寸  可以簡單的理解為 這個聚合圖形最多可以有多少行

  vsize:垂直尺寸   同理,這個聚合圖形最多可以有多少列

  resourcetye :圖形的型別  0 代表graph  1 簡單graph 2 文字 。。。。

  resourceid :ID of the screen that the item belongs to. 也就是說需要加入的圖形它的ID是多少,那麼圖形ID怎麼獲取呢? 接下來講解

  rowspan:螢幕專案將跨越的行數。

  colspan:螢幕專案將跨越的列數。  意思就是圖形佔多少行多少列  這裡 預設為0就行(1行1列)  不需要太大

  x: 代表列!!!!!!!!!!!!!不是行

  y:  這裡的x y代表的是圖形的座標 0 0 就是第一行第一列  0 1 第一行第二列 依次類推(這裡需要依靠前面設定的hsize,vsize不能超過了),測試的時候這裡面體比較大,想要把多個監控放在一行:解決辦法是x相同y不同

  auth : 認證資訊

  id : 識別方法

下面是我的程式碼

def create_screen():
    neirong = {
        "jsonrpc": "2.0",
        "method": "screen.create",
        "params": {
            "name": "Graphsall(disk,cpu,mem)",
            "hsize": 3, ###代表建立的時候 有多少列
            "vsize": 45, ## 行
            "screenitems": [
                {'resourcetype': 0, 'resourceid': '42183', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 0},
                {'resourcetype': 0, 'resourceid': '42189', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 0},
                {'resourcetype': 0, 'resourceid': '42186', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 0},
                {'resourcetype': 0, 'resourceid': '42195', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 1},
                {'resourcetype': 0, 'resourceid': '42210', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 1},
                {'resourcetype': 0, 'resourceid': '42198', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 1},
                {'resourcetype': 0, 'resourceid': '42204', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 2},
                {'resourcetype': 0, 'resourceid': '42213', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 2},
                {'resourcetype': 0, 'resourceid': '42207', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 2},
                {'resourcetype': 0, 'resourceid': '53703', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 3},
                {'resourcetype': 0, 'resourceid': '53709', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 3},
                {'resourcetype': 0, 'resourceid': '53706', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 3},
                {'resourcetype': 0, 'resourceid': '53715', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 4},
                {'resourcetype': 0, 'resourceid': '53739', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 4},
                {'resourcetype': 0, 'resourceid': '53718', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 4},
                {'resourcetype': 0, 'resourceid': '53724', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 5},
                {'resourcetype': 0, 'resourceid': '53742', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 5},
                {'resourcetype': 0, 'resourceid': '53727', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 5},
                {'resourcetype': 0, 'resourceid': '53733', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 6},
                {'resourcetype': 0, 'resourceid': '53745', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 6},
                {'resourcetype': 0, 'resourceid': '53736', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 6},
                {'resourcetype': 0, 'resourceid': '53751', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 7},
            ]
        },
        "auth": authid,
        "id": 4
    }

這裡用的是笨辦法 將所有資料想辦法生成統一格式,然後批量加,其實可以潛逃變數來完成

這裡面有個resourceid 獲取的方法如下

def get_graid():
    global graphid
    graphid = []
    for i in hostidlist:
        neirong = {
            "jsonrpc": "2.0",
            "method": "graph.get",
            "params": {
                "output": "extend",
                "hostids": i,
                "sortfield": "name"
            },
            "auth": authid,
            "id": 1
        }
        response1 = requests.post(url, data=json.dumps(neirong), headers=headers)
        result1 = (response1.text)
        result2 = json.loads(result1)
        #print("zhujiname is %s"%i)
        #print("reeeeeeeeee is %s"%result2)

        graphid11 = []
#result2['result']代表的是一個主機的全部圖形
  #      print(result2)
        for i in result2['result']:
             if i['name']=='CPU utilization' or  i['name']=='Memory usage' or i['name']=='Disk space usage /' :
                 graphid11.append(i['graphid'])

        if(len(graphid11)) == 3:       ## 如果等於3 那麼再次迴圈把這些記錄下來。。 比較笨拙 需要改進
            for i in result2['result']:
                if i['name']=='CPU utilization' or  i['name']=='Memory usage' or i['name']=='Disk space usage /' :
                    graphid.append(i['graphid'])
#獲取到的圖形id的列表
    print(graphid)

上面的程式對每個主機的圖形數量進行了比較,因為我們目的是 每臺主機在聚合圖形中顯示一行 分別是CPU utilization Memory usage Disk space usage

 

上圖上還有個hostid變數這個變數需要gethost來獲取

import requests
import json

url = 'http://zabbix.XXXXX.com.cn/api_jsonrpc.php'
headers = {'Content-Type': 'application/json'}
def getToken():
    url = 'http://zabbix.pagoda.com.cn/api_jsonrpc.php'

    headers = {'Content-Type': 'application/json'}
    auth = {
        "jsonrpc": "2.0",
        "method": "user.login",
        "params": {
            "user": "XXXX",  ###驗證
            "password": "XXX"
        },
        "id": 1,
        "auth": None
    }
    response = requests.post(url, data=json.dumps(auth), headers=headers)
    global authid
    authid = json.loads(response.text)['result']  ### auth的id  也就是token

def getHosts():
    neirong = {
        "jsonrpc": "2.0",
        "method": "host.get",
        "params": {
            "output": [
                "hostid",
                "host"
            ],
            "selectInterfaces": [
                "interfaceid",
                "ip"
            ]
        },
        "id": 2,
        "auth": authid
    }
    response = requests.post(url, data=json.dumps(neirong), headers=headers)
    result1=(response.text)
    result2=json.loads(result1)

    global hostidlist
    hostidlist=[]
    for i in result2['result']:
        #將主機放到一個列表裡面
        hostidlist.append(i['hostid'])

 

如上圖所示