通过zabbix自带api进行主机的批量添加操作
Posted reblue520
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过zabbix自带api进行主机的批量添加操作相关的知识,希望对你有一定的参考价值。
通过zabbix自带api进行批量添加主机
我们需要监控一台服务器的时候,当客户端装好zabbix-agent端并正确配置以后,需要在zabbix-server的web gui界面进行添加zabbix-agent操作,填写host_name,访问名,ip地址,端口还有模板等信息
这样操作比较方便,但当我们需要添加的主机有上百台甚至千台时效率就比较低了,一般有如下解决方案:
1.通过自动发现,自动注册主机
2.通过zabbix_api的方式进行批量操作
今天我们使用第二种方式进行操作,定制性较强,不容易出错
主要是通过读取excel主机列表信息,发送post请求操作zabbix的api进行主机自动添加
环境:
zabbix版本: zabbix3.0.4
python版本:python2.7
api参考文档
# https://www.zabbix.com/documentation/3.0/manual/api
host列表信息如下
批量添加主机的zabbix_api代码:
#coding:utf-8 import json import urllib2 from urllib2 import URLError import sys import xlrd # 测试ok class ZabbixTools: def __init__(self): #self.url = \'http://10.11.0.215/zabbix/api_jsonrpc.php\'] # 一般不需要带/zabbix这个路径,否则可能无法找到api self.url = \'http://10.11.0.215/api_jsonrpc.php\' self.header = {"Content-Type":"application/json"} # 登陆验证 def user_login(self): data = json.dumps({ "jsonrpc": "2.0", "method": "user.login", "params": { "user": \'admin\', "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\'] # 创建host #def host_create(self, hostName,visibleName,hostIp,dnsName,proxyName, hostgroupName, templateName1, templateName2): def host_create(self, hostName,visibleName,hostIp, hostgroupName, templateName1): data = json.dumps({ "jsonrpc":"2.0", "method":"host.create", "params":{ "host": hostName, "name": visibleName, #"proxy_hostid": self.proxy_get(proxyName), "interfaces": [ { "type": 1, "main": 1, "useip": 1, "ip": hostIp, "dns": "", "port": "10050" } ], "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" % (hostip, response[\'result\'][\'hostids\'][0]) self.hostid = response[\'result\'][\'hostids\'] return response[\'result\'][\'hostids\'] # 创建host,两个模板 def host_create_with2templates(self, hostName,visibleName,hostIp, hostgroupName, templateName1, templateName2): data = json.dumps({ "jsonrpc":"2.0", "method":"host.create", "params":{ "host": hostName, "name": visibleName, #"proxy_hostid": self.proxy_get(proxyName), "interfaces": [ { "type": 1, "main": 1, "useip": 1, "ip": hostIp, "dns": "", "port": "10050" } ], "groups": [ { "groupid": self.hostgroup_get(hostgroupName) } ], "templates": [ { "templateid": self.template_get(templateName1) }, { "templateid": self.template_get(templateName2) } ], }, "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" % (hostip, response[\'result\'][\'hostids\'][0]) self.hostid = response[\'result\'][\'hostids\'] return response[\'result\'][\'hostids\'] # 创建host,两个模板 def host_create_with3templates(self, hostName,visibleName,hostIp, hostgroupName, templateName1, templateName2, templateName3): data = json.dumps({ "jsonrpc":"2.0", "method":"host.create", "params":{ "host": hostName, "name": visibleName, #"proxy_hostid": self.proxy_get(proxyName), "interfaces": [ { "type": 1, "main": 1, "useip": 1, "ip": hostIp, "dns": "", "port": "10050" } ], "groups": [ { "groupid": self.hostgroup_get(hostgroupName) } ], "templates": [ { "templateid": self.template_get(templateName1) }, { "templateid": self.template_get(templateName2) }, { "templateid": self.template_get(templateName3) } ], }, "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" % (hostip, response[\'result\'][\'hostids\'][0]) self.hostid = response[\'result\'][\'hostids\'] return response[\'result\'][\'hostids\'] # zabbix_proxy获取函数 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__": # 实例化ZabbixTools对象 test = ZabbixTools() #result = test.host_get(\'node5.chinasoft.com\') #print result # 获取host列表 workbook = xlrd.open_workbook(\'host_list.xls\') for row in xrange(workbook.sheets()[0].nrows): hostname=workbook.sheets()[0].cell(row,0).value visible=workbook.sheets()[0].cell(row,1).value hostip=workbook.sheets()[0].cell(row,2).value #dnsname=workbook.sheets()[0].cell(row,3).value #proxy=workbook.sheets()[0].cell(row,4).value hostgroup=workbook.sheets()[0].cell(row,3).value hosttemp=workbook.sheets()[0].cell(row,4).value hosttemp2=workbook.sheets()[0].cell(row,5).value hosttemp3=workbook.sheets()[0].cell(row,6).value hostgroup=hostgroup.strip() hostnameGet=test.host_get(hostname) if hostnameGet.strip() != \'\': print "%s have exist! Cannot recreate !\\n" % hostnameGet continue # 主机有三个模板的情况 if hostnameGet.strip() == \'\' and hosttemp != \'\' and hosttemp2 != \'\' and hosttemp3 != \'\': print hostname + \',\' + visible + \',\' + hostip + \',\' + hostgroup + \',\' + hosttemp + \',\' + hosttemp2 + \',\' + hosttemp3 test.host_create_with3templates(hostname,visible,hostip,hostgroup,hosttemp,hosttemp2,hosttemp3) continue # 两个模板的情况 if hostnameGet.strip() == \'\' and hosttemp != \'\' and hosttemp2 != \'\': print hostname + \',\' + visible + \',\' + hostip + \',\' + hostgroup + \',\' + hosttemp + \',\' + hosttemp2 test.host_create_with2templates(hostname,visible,hostip,hostgroup,hosttemp,hosttemp2) continue # 一个模板的情况 if hostnameGet.strip() == \'\' and hosttemp != \'\': print hostname + \',\' + visible + \',\' + hostip + \',\' + hostgroup + \',\' + hosttemp test.host_create(hostname,visible,hostip,hostgroup,hosttemp)
#coding:utf-8 import j以上是关于通过zabbix自带api进行主机的批量添加操作的主要内容,如果未能解决你的问题,请参考以下文章