在网上查阅了一些资料,Zabbix批量添加节点主要有以下几种方法:一是通过Zabbix管理页面,配置自动发现规则来发现并自动添加节点,配置Action配置来进行模板关联;二是可以通过Zabbix提供的Json API编写程序实现批量添加(可同时关联模板)、删除节点等管理功能;三是可以先导出一份节点的xml配置,然后通过程序修改xml,最后再导入修改后的xml配置来实现。
其中方法一操作相对简便,无需其他辅助工具,Json API优点是可以精确管理节点,不会因为设置的IP范围比较粗略而添加不必要的节点。同时可以自动关联模板,实现一键配置。此外Json API功能强大,几乎可以实现全部管理功能。
1. 自动发现节点
登录Zabbix后,“Configuration”→“Discovery”→“Create discovery rule”。
进入Discovery rules配置页面,如下图:
名字随意,方便项目组识别和管理即可,这里最重要的是配置正确的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的方法。