天天看點

Zabbix批量增加節點方法(自動發現及Json API)

       在網上查閱了一些資料,Zabbix批量添加節點主要有以下幾種方法:一是通過Zabbix管理頁面,配置自動發現規則來發現并自動添加節點,配置Action配置來進行模闆關聯;二是可以通過Zabbix提供的Json API編寫程式實作批量添加(可同時關聯模闆)、删除節點等管理功能;三是可以先導出一份節點的xml配置,然後通過程式修改xml,最後再導入修改後的xml配置來實作。

       其中方法一操作相對簡便,無需其他輔助工具,Json API優點是可以精确管理節點,不會因為設定的IP範圍比較粗略而添加不必要的節點。同時可以自動關聯模闆,實作一鍵配置。此外Json API功能強大,幾乎可以實作全部管理功能。

1. 自動發現節點

       登入Zabbix後,“Configuration”→“Discovery”→“Create discovery rule”。

       進入Discovery rules配置頁面,如下圖:

Zabbix批量增加節點方法(自動發現及Json API)

       名字随意,友善項目組識别和管理即可,這裡最重要的是配置正确的IP範圍,IP範圍可以如上圖通過“-”指定一個範圍,也可以寫單個IP,為了避免發現多餘的節點,建議将範圍寫得精确一點。其他設定項可以參考一個現有的配置項,如下圖。

Zabbix批量增加節點方法(自動發現及Json API)

       完成上述配置後,即在“Monitoring”→“Discovery”選擇自己剛剛配置的發現規則的名稱來檢視已經發現的節點,但此時節點還沒有關聯任何模闆,無法實作性能監控功能。需要關聯監控模闆。

       “Configuration”→“Action”→“Create action”,注意“Event source”選擇Discovery。

       進入Action配置頁面:

       在“Conditions”裡要關聯Discovery的配置;

       在“Operation”裡,Operation type選擇Link to templates,然後選擇要關聯的模闆。其實配置項,可以參考一個已有的配置項來完成。同樣是在“Operation”裡,可以配置hostgroup。

       至此,已經完成了節點配置并關聯監控項模闆,Zabbix配置已經基本完成。下面将介紹一下Json API方式管理

2. Json API

        Zabbix對外提供Json API來支援豐富的管理功能。為了簡化編碼,這裡使用Python語言進行接口調用,實作了一個可以批量添加節點的功能。API文檔可以在官網查到:https://www.zabbix.com/documentation/4.0/manual/api

示例代碼如下:

#coding:utf-8
'''
By Tao 2019
'''
import json
import xlrd
import requests
import os

# 測試ok
class ZabbixTools(object):
    def __init__(self, ip):
        self.url = 'http://'+ip+'/zabbix/api_jsonrpc.php'
        #self.header = {"Content-Type":"application/json"} 
        self.header = {"Content-Type":"application/json-rpc"}
        self.auth = ''

    # 登陸驗證
    def user_login(self, user, passcode):
        data = json.dumps({
                           "jsonrpc": "2.0",
                           "method": "user.login",
                           "params": {
                                      "user": user,
                                      "password": passcode
                                      },
                           "id": 1
                           })
        result = requests.post(self.url, data=data, headers=self.header)
        self.auth = json.loads(result.text)['result']
    
    # 登出
    def logout(self):
        data = json.dumps({
                           "jsonrpc": "2.0",
                           "method": "user.logout",
                           "params": [],
                           "id": 1,
                           "auth":self.auth
                           })           

        result = requests.post(self.url, data=data, headers=self.header)
        print(result.text)
    
    def get_host_by_name(self, hostName):
        data=json.dumps({
                "jsonrpc": "2.0",
                "method": "host.get",
                "params": {
                        "filter": {
                                "host": [
                                        hostName
                                        ]
                                }
                        },
                        "auth": self.auth,
                        "id": 1
                        })
        
        
    def get_hostgroupId(self, hostgroupName):
        data = json.dumps({
                           "jsonrpc":"2.0",
                           "method":"hostgroup.get",
                           "params":{
                                     "output": "extend",
                                     "filter": {
                                                "name": [
                                                         hostgroupName,
                                                         ]
                                                }
                                     },
                           "auth":self.auth,
                           "id":1,
                           })
        result = requests.post(self.url, data=data, headers=self.header)
        return json.loads(result.text)['result'][0]['groupid']
    
    def get_templateId(self, templateName):
        data = json.dumps({
                           "jsonrpc":"2.0",
                           "method": "template.get",
                           "params": {
                                      "output": "extend",
                                      "filter": {
                                                 "host": [
                                                          templateName,
                                                          ]
                                                 }
                                      },
                           "auth":self.auth,
                           "id":1,
                           })
        result = requests.post(self.url, data=data, headers=self.header)
        return json.loads(result.text)['result'][0]['templateid']
        
    def create_host(self, ip, groupid):
        data = json.dumps({
                "jsonrpc": "2.0",
                "method": "host.create",
                "params": {
                        "host": ip,
                        "interfaces": [{"type": 1,  "main": 1, "useip": 1, "ip": ip, "dns": "", "port": "10050"}],
                        "groups": [{ "groupid": groupid}],
                        "templates": [{"templateid": "10867"},{"templateid": "10105"}],
                        },
                "auth": self.auth,
                "id": 1})
        result = requests.post(self.url, data=data, headers=self.header)
        print(result.text)
        
    

if __name__ == '__main__':
    '''讀Excel檔案中的ip清單'''
    '''
    data = xlrd.open_workbook('ServerList.xlsx')
    #table = data.sheets()[0]
    table = data.sheet_by_name('Sheet1')
    zbt = ZabbixTools('22.188.120.250')
    zbt.user_login('Admin', 'zabbix')
    for i in range(table.nrows):
        zbt.create_host(table.cell_value(i,0))
    zbt.logout()
    os.system("pause")
    '''
    '''從Txt檔案中讀取ip清單'''
    zbt = ZabbixTools('22.188.120.250')
    zbt.user_login('Admin', 'zabbix')
    groupid = zbt.get_hostgroupId('ZabbixTest')
    with open('fulllist.txt', 'r') as f:        
        for line in f:            
            ip = line.replace('\n', '') 
            zbt.create_host(ip, groupid)
    zbt.logout()
    os.system("pause")
    '''
    zbt = ZabbixTools('22.188.120.250')
    zbt.user_login('Admin', 'zabbix')
    print(zbt.get_templateId('Redis'))
    zbt.create_host('22.188.188.12')
    zbt.logout()
    '''
           

       此處使用request子產品進行http請求,代碼比urllib子產品要簡單。grouid和templateid貌似在管理頁面上看不到,是以這裡提供了根據group名稱和template名稱查id的方法。