通過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 json import urllib2 from urllib2 import URLError import sys import xlrd # 定義zabbix工具類 # 需要修改zabbix_server的url登錄服務端的賬號密碼 class ZabbixTools: def __init__(self): self.url = 'http://10.11.0.215/zabbix/api_jsonrpc.php' # 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": 'pass' }, "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() # print 'template_get_result:%s' % response['result'] self.templateID = response['result'][0]['templateid'] return response['result'][0]['templateid'] # 創建主機組hostgroup def hostgroup_create(self, hostgroupName): data = json.dumps({ "jsonrpc": "2.0", "method": "hostgroup.create", "params": { "name": hostgroupName }, "auth": self.user_login(), "id": 1 }) # print "hostgroupid:|%s|" % hostgroupid # 查詢主機組是否存在,如果不存在就創建 hostgroupid = self.hostgroup_get(hostgroupName) if hostgroupid == '': request = urllib2.Request(self.url, data) for key in self.header: request.add_header(key, self.header[key]) try: result = urllib2.urlopen(request) print 'result:%s' % result except URLError as e: print "Error as ", e else: response = json.loads(result.read()) result.close() # print 'result groupid:%s' % response['result']['groupids'] return response['result']['groupids'] # 創建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,3個模板 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() # 讀取excel的每一行,獲取host信息列表 workbook = xlrd.open_workbook('host_list02.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() # 判斷是否有這個主機組,如果沒有就創建 hostgroupid = test.hostgroup_get(hostgroup) if hostgroupid == '': test.hostgroup_create(hostgroup) hostnameGet=test.host_get(hostname) if hostnameGet.strip() != '': print "%s have exist! Cannot recreate !\n" % hostnameGet continue # 目前只支持有3個模板的主機,如果有更多模板,需要修改函數,必須保證每一個模板在server端都是存在的否則會報錯 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)