依据网上大神提供的解决方案进行了一次zabbix批量添加主机的实践,发现这种方式也可算是另类的“自动化”,虽然还需要手动执行,但最终还是减少了大部分工作量,提高了生产力。
方案参考:
http://blog.51cto.com/net881004/2089104
系统与环境准备
Ubuntu18.04
python2.7环境
1.安装python的xlrd包(用于支持读取excel文件)
官网下载xlrd模块
https://pypi.python.org/pypi/xlrd
#使用pypi安装模块,需先安装pypi包
apt-get install pypi
#安装xlrd
pip install xlrd
2.批量添加脚本
#来源于参考链接
#json中的相关方法对象,直接在zabbix官方网站上获取
##############################################################################################
#!/usr/local/kk-mail/app/engine/bin/python
#coding:utf-8
import json
import urllib2
from urllib2 import URLError
import sys
import xlrd
class ZabbixTools:
def __init__(self):
self.url = 'http://10.x.x.x/zabbix/api_jsonrpc.php' #zabbix的api接口
self.header = {"Content-Type":"application/json"}
def user_login(self):
data = json.dumps({
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin", #web登录zabbix的管理员账号或有权限账号
"password": "zabbix"
},
"id": 0
})
request = urllib2.Request(self.url, data)
for key in self.header:
request.add_header(key, self.header[key])
try:
result = urllib2.urlopen(request)
except URLError as e:
print "Auth Failed, please Check your name and password:", e.code
else:
response = json.loads(result.read())
result.close()
self.authID = response['result']
return self.authID
def host_get(self,hostName):
data = json.dumps({
"jsonrpc":"2.0",
"method":"host.get",
"params":{
"output":["hostid","name"],
"filter":{"host":hostName}
},
"auth":self.user_login(),
"id":1,
})
request = urllib2.Request(self.url, data)
for key in self.header:
request.add_header(key, self.header[key])
try:
result = urllib2.urlopen(request)
except URLError as e:
if hasattr(e, 'reason'):
print 'We failed to reach a server.'
print 'Reason: ', e.reason
elif hasattr(e, 'code'):
print 'The server could not fulfill the request.'
print 'Error code: ', e.code
else:
response = json.loads(result.read())
result.close()
print "Number Of %s: " % hostName, len(response['result'])
lens=len(response['result'])
if lens > 0:
return response['result'][0]['name']
else:
return ""
def hostgroup_get(self, hostgroupName):
data = json.dumps({
"jsonrpc":"2.0",
"method":"hostgroup.get",
"params":{
"output": "extend",
"filter": {
"name": [
hostgroupName,
]
}
},
"auth":self.user_login(),
"id":1,
})
request = urllib2.Request(self.url, data)
for key in self.header:
request.add_header(key, self.header[key])
try:
result = urllib2.urlopen(request)
except URLError as e:
print "Error as ", e
else:
response = json.loads(result.read())
result.close()
lens=len(response['result'])
if lens > 0:
self.hostgroupID = response['result'][0]['groupid']
return response['result'][0]['groupid']
else:
print "no GroupGet result"
return ""
def template_get(self, templateName):
data = json.dumps({
"jsonrpc":"2.0",
"method": "template.get",
"params": {
"output": "extend",
"filter": {
"host": [
templateName,
]
}
},
"auth":self.user_login(),
"id":1,
})
request = urllib2.Request(self.url, data)
for key in self.header:
request.add_header(key, self.header[key])
try:
result = urllib2.urlopen(request)
except URLError as e:
print "Error as ", e
else:
response = json.loads(result.read())
result.close()
self.templateID = response['result'][0]['templateid']
return response['result'][0]['templateid']
def host_create(self, hostName,visibleName,dnsName, hostgroupName, templateName1,ip):
data = json.dumps({
"jsonrpc":"2.0",
"method":"host.create",
"params":{
"host": hostName,
"name": visibleName,
"interfaces": [
{
"type": 2,
"main": 1,
"useip": 0,
"ip": ip,
"dns": dnsName,
"port": "161"
}
],
"groups": [
{
"groupid": self.hostgroup_get(hostgroupName)
}
],
"templates": [
{
"templateid": self.template_get(templateName1)
}
],
},
"auth": self.user_login(),
"id":1
})
request = urllib2.Request(self.url, data)
for key in self.header:
request.add_header(key, self.header[key])
try:
result = urllib2.urlopen(request)
except URLError as e:
print "Error as ", e
else:
response = json.loads(result.read())
result.close()
print "host : %s is created! id is %s\n" % (dnsname, response['result']['hostids'][0])
self.hostid = response['result']['hostids']
return response['result']['hostids']
def proxy_get(self, ProxyName):
data = json.dumps({
"jsonrpc":"2.0",
"method": "proxy.get",
"params": {
"output": "extend",
"selectInterface": "extend",
"filter": {
"host": [ ProxyName, ]
}
},
"auth":self.user_login(),
"id":1,
})
request = urllib2.Request(self.url, data)
for key in self.header:
request.add_header(key, self.header[key])
try:
result = urllib2.urlopen(request)
except URLError as e:
print "Error as ", e
else:
response = json.loads(result.read())
result.close()
self.templateID = response['result'][0]['proxyid']
return response['result'][0]['proxyid']
if __name__ == "__main__":
test = ZabbixTools()
workbook = xlrd.open_workbook('zabbixauto.xlsx') #读取文件名为“zabbixauto.xlsx”的表格文件
for row in xrange(workbook.sheets()[0].nrows): #excel文件包含以下6列
hostname=workbook.sheets()[0].cell(row,0).value
visible=workbook.sheets()[0].cell(row,1).value
dnsname=workbook.sheets()[0].cell(row,2).value
hostgroup=workbook.sheets()[0].cell(row,3).value
hosttemp=workbook.sheets()[0].cell(row,4).value
ip=workbook.sheets()[0].cell(row,5).value
hostgroup=hostgroup.strip()
hostnameGet=test.host_get(hostname)
if hostnameGet.strip()=='':
test.host_create(hostname,visible,dnsname,hostgroup,hosttemp,ip)
else:
print "%s have exist! Cannot recreate !\n" % hostnameGet
3.编辑excel
excel文件中的每列对应,在zabbix上创建主机时的相关设置
第一列 Host name
第二列 Visible name
第三列 dns name
第四列 hostgroup
第五列 ip

4.脚本执行
实际批量添加时,将excel文件和批量脚本放到同一个目录下,填写好excel后,直接执行脚本即可
root@zabbix:/home/admin# ls -l
total 11484
-rwxrwxr-x 1 admin admin 10067 Mar 11 07:32 zabbixauto-host.py
-rw-rw-r-- 1 admin admin 9696 Mar 11 07:27 zabbixauto.xlsx
5.验证


网友评论