在工作中可能公司的服务器的数量过于庞大, 当单次需要添加成百上千个被监控主机的时候, 传统简单的 zabbix 的 web 端添加被监控主机工作量繁重, 也容易出错.
那么这时候脚本自动化运行就显得尤为重要. 今天就讲述一种利用 ZABBIX-API 接口进行批量增加被监控主机的操作.
1, 编写 ZABBIX-API - 自定义库
自定义库不需要改动, 不存在差异化, 请注意使用 python 的版本, 代码中有注明, 请选择使用自己的版本
- #!/usr/bin/python
- # encoding: utf-8
- #filename: zabbix_base_api.py
- #author: LINFAN
- #writetime:20190725
- import JSON
- import urllib.request #python3 使用
- #import urllib2 #python2 使用
- class zabbix_base_api(object):
- def __init__(self,url = "http://192.168.73.9/api_jsonrpc.php" ,header = {
- "Content-Type": "application/json"
- }):
- self.url = url
- self.header = header
- # post
- def post_request(self,url, data, header):
- # request = urllib2.Request(url, data, header) #python2 使用
- # result = urllib2.urlopen(request)
- #
- request = urllib.request.Request(url, data, header) #python3 使用
- result = urllib.request.urlopen(request)
- # ccc = result.read()
- # print (ccc)
- # response = JSON.loads(ccc)
- response = JSON.loads(result.read())
- result.close()
- return response
- def json_data(self,method,params,authid):
- data = JSON.dumps(
- {
- "jsonrpc": "2.0",
- "method": method,
- "params": params,
- "auth": authid,
- "id": 1
- })
- request_info = self.post_request(self.url, data.encode('utf-8'), self.header)
- return request_info
- # 认证信息
- def authid(self,user,password): #定 JSON 中 auth 的信息
- data = JSON.dumps(
- {
- "jsonrpc": "2.0",
- "method": "user.login",
- "params": {
- "user": user,
- "password": password
- },
- "id": 1
- })
- authid = self.post_request(self.url, data.encode('utf-8'), self.header)
- try:
- return authid['result']
- except KeyError:
- print ('用户名或密码错误')
- exit()
- def text_process(self,file):
- import re
- find = re.compile(r"^#")
- text_info = []
- # f = open(file,"r",encoding='UTF-8')
- f = open(file, "r")
- text = f.readlines()
- f.close()
- for i in text:
- if find.search(i.rstrip("\n")) == None:
- text_info.append(i.rstrip("\n"))
- return text_info
- # 注销认证
- def login_out(self,authid):
- data = JSON.dumps(
- {
- "jsonrpc": "2.0",
- "method": "user.logout",
- "params": [],
- "id": 1,
- "auth": authid
- })
- a = self.post_request(self.url, data.encode('utf-8'), self.header)
- return '认证信息已注销'
2. 编写添加被监控主机的脚本
- #!/usr/bin/python
- # encoding: utf-8
- import zabbix_base_api # 调用 zabbix-API - 自定义库
- import time
- z_api_con = zabbix_base_api.zabbix_base_api(url='http://SERVER_IP/api_jsonrpc.php')# 填写自己的 ZABBIX 的服务端 IP 地址
- def getHostid(method,ip,authid):
- data = {
- "output": ["hostid", "host"],
- "filter": {
- "ip": ip
- },
- "selectInterfaces": ["ip"],
- "selectParentTemplates": ["name"]
- }
- responses = z_api_con.json_data(method, data, authid)
- return responses
- # 请在 Web 端将鼠标指向代理, 组, 模板的名称, 就会出现对应的 ID#
- def hostCreate(method,ip,authid):
- data = {
- "host": ip,
- "proxy_hostid": 13323, #代理唯一标识码
- "interfaces": [
- {
- "type": 1,
- "main": 1,
- "useip": 1,
- "ip": ip,
- "dns": "",
- "port": "10050" #端口
- }
- ],
- "groups": [
- {
- "groupid": 222 #组的唯一标识
- }
- ],
- "templates": [
- {
- "templateid": 14041 #模板的唯一标识
- }
- ]
- }
- responses = z_api_con.json_data(method, data, authid)
- return responses
- def proxyGet(method,hostid,authid):
- data = {
- "output": "extend",
- "selectInterface": "extend"
- }
- responses = z_api_con.json_data(method, data, authid)
- return responses
- def proxyUpdate(method,hostid,authid):
- data = {
- "proxyid": 10255, #此处不需要更改 #
- "hosts": [
- hostid
- ]
- }
- responses = z_api_con.json_data(method, data, authid)
- return responses
- def main_all(authid):
- file = open("a.txt", "r") #打开 ip 那个文件
- lists = file.readlines()
- print (lists)
- add_file = open("c.txt","a+")
- iplist = []
- for list in lists:
- ip = list.strip("\n")
- # 判断主机是否存在, 存在将 hostid 和 ip 写入文件 ((c.txt)), 不存在则创建, 将 IP 写入文件 (c.txt)
- hostget = getHostid("host.get",ip,authid)["result"]
- print(hostget)
- if hostget:
- hostid = hostget[0]["hostid"]
- host = hostget[0]["host"]
- add_file.writelines(hostid+"\t"+host+"\n")
- else:
- hostcreate = hostCreate("host.create",ip,authid)
- print(hostcreate)
- add_file.writelines(ip+"\n")
- add_file.close()
- file.close()
- if __name__ == "__main__":
- starttime = time.time()
- print ("Process is running...")
- authid = z_api_con.authid('zabbix 的账户', 'zabbix 的密码')
- # authid = z_api_con.authid('admin','zabbix')
- main_all(authid)
- z_api_con.login_out(authid)
- endtime = time.time()
- print (endtime-starttime)
这里我是使用测试机在本地做了隧道, 直接在本地利用 pycha 工具执行脚本. 本人亲试, 解放双手! 哈哈
来源: http://blog.51cto.com/13858192/2423511