在網上查閱了一些資料,Zabbix批量添加節點主要有以下幾種方法:一是通過Zabbix管理頁面,配置自動發現規則來發現并自動添加節點,配置Action配置來進行模闆關聯;二是可以通過Zabbix提供的Json API編寫程式實作批量添加(可同時關聯模闆)、删除節點等管理功能;三是可以先導出一份節點的xml配置,然後通過程式修改xml,最後再導入修改後的xml配置來實作。
其中方法一操作相對簡便,無需其他輔助工具,Json API優點是可以精确管理節點,不會因為設定的IP範圍比較粗略而添加不必要的節點。同時可以自動關聯模闆,實作一鍵配置。此外Json API功能強大,幾乎可以實作全部管理功能。
1. 自動發現節點
登入Zabbix後,“Configuration”→“Discovery”→“Create discovery rule”。
進入Discovery rules配置頁面,如下圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TP35EeZpnYoJ1MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLwMjN1ITOwIjM2ATOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
名字随意,友善項目組識别和管理即可,這裡最重要的是配置正确的IP範圍,IP範圍可以如上圖通過“-”指定一個範圍,也可以寫單個IP,為了避免發現多餘的節點,建議将範圍寫得精确一點。其他設定項可以參考一個現有的配置項,如下圖。
完成上述配置後,即在“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的方法。