53

调用ZABBIX-API进行大批量新增监控主机,解放运维监控的双手-上古杰作的博客

 5 years ago
source link: https://blog.51cto.com/13858192/2423511
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在工作中可能公司的服务器的数量过于庞大,当单次需要添加成百上千个被监控主机的时候,传统简单的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工具执行脚本。本人亲试,解放双手!哈哈


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK