• 通过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
    " % (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
    " % (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
    " % (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 !
    " % 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
    " % (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
    " % (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
    " % (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 !
    " % 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)
     
  • 相关阅读:
    mysql 添加自增长ID(序列方式)
    获取本地IP地址信息
    Intellij 快捷键
    java转换汉字为首字母搜索,
    gitee在linux下自动备份
    七牛云续费dns的ssl证书
    shiro 的realm的授权
    realme的shiro简单实现方法
    shiro初探,最简单的认证,通过ini文件。
    git config file
  • 原文地址:https://www.cnblogs.com/reblue520/p/7614347.html
Copyright © 2020-2023  润新知