ZABBIX批量添加主机

一个Python文件


# /usr/bin/env python3
# -*- coding:utf-8 -*-
#   mail: infaaf@126.com
import requests
import json
import os

## user config here
**ip = 'ZABBIX主机IP'
user = "Admin"
password = "12345"**

## user config end

class ZabbixApi:
    def __init__(self, ip, user, password):
        self.url = 'http://' + ip + '/zabbix/api_jsonrpc.php'  # 'http://192.168.1.20/zabbix/api_jsonrpc.php'
        self.headers = {"Content-Type": "application/json",
                        }
        self.user = user
        self.password = password
        self.auth = self.__login()

    def __login(self):
        '''
        zabbix登陆获取auth
        :return: auth  #  样例bdc64373690ab9660982e0bafe1967dd
        '''
        data = json.dumps({
            "jsonrpc": "2.0",
            "method": "user.login",
            "params": {
                "user": self.user,
                "password": self.password
            },
            "id": 10,
            # "auth": 'none'
        })
        try:
            response = requests.post(url=self.url, headers=self.headers, data=data, timeout=2)
            # {"jsonrpc":"2.0","result":"bdc64373690ab9660982e0bafe1967dd","id":10}
            auth = response.json().get('result', '')
            return auth
        except Exception as e:
            print("\033[0;31;0m Login error check: IP,USER,PASSWORD\033[0m")
            raise Exception

    def host_get(self, hostname=''):
        '''
        获取主机。不输入hostname 则获取所有
        :param hostName: zabbix主机名不允许重复。(IP允许重复)。#host_get(hostname='gateway1')
        :return: {'jsonrpc': '2.0', 'result': [], 'id': 21}
        :return: {'jsonrpc': '2.0', 'result': [{'hostid': '10277', ... , 'host': 'gateway', ...}], 'id': 21}
        '''
        if hostname == '':
            # print("no hostname and find all host")
            data = json.dumps({
                "jsonrpc": "2.0",
                "method": "host.get",
                "params": {
                    "output": [
                        "hostid",
                        "host"
                    ],
                    "selectInterfaces": [
                        "interfaceid",
                        "ip"
                    ]
                },
                "id": 20,
                "auth": self.auth
            })
        else:
            data = json.dumps({
                "jsonrpc": "2.0",
                "method": "host.get",
                "params": {"output": "extend",
                           "filter": {"host": hostname},
                           },
                "id": 21,
                "auth": self.auth
            })
        try:
            response = requests.get(url=self.url, headers=self.headers, data=data, timeout=2)
            # hosts_count=len(response.json().get('result',''))
            # print('l',hosts)
            return response.json()   # len(ret.get('result'))为1时获取到,否则未获取到。
        except Exception as e:
            print("\033[0;31;0m HOST GET ERROR\033[0m")
            raise Exception

    def hostgroup_get(self,hostGroupName=''):
        '''
        获取主机组
        :param hostGroupName:
        :return: {'jsonrpc': '2.0', 'result': [{'groupid': '15', 'name': 'linux group 1', 'internal': '0', 'flags': '0'}], 'id': 1}
        '''
        data = json.dumps({
            "jsonrpc": "2.0",
            "method": "hostgroup.get",
            "params": {
                "output": "extend",
                "filter": {
                    "name": hostGroupName
                }
            },
            "auth": self.auth,
            "id": 1,
            })
        try:
            response = requests.get(url=self.url, headers=self.headers, data=data, timeout=2)
            # hosts_count=len(response.json().get('result',''))
            # print('l',hosts)
            return response.json()   # len(ret.get('result'))为1时获取到,否则未获取到。

        except Exception as e:
            print("\033[0;31;0m HOSTGROUP GET ERROR\033[0m")
            raise Exception

    def hostgroup_create(self,hostGroupName=''):
        if len(self.hostgroup_get(hostGroupName).get('result'))==1:
            print("无需创建,hostgroup存在")
            return 100
        data = json.dumps({
            "jsonrpc": "2.0",
            "method": "hostgroup.create",
            "params": {
                "name": hostGroupName
            },
            "auth": self.auth,
            "id": 1
            })
        try:
            response = requests.get(url=self.url, headers=self.headers, data=data, timeout=2)
            # hosts_count=len(response.json().get('result',''))
            # print('l',hosts)
            return response.json()   # len(ret.get('result'))为1时获取到,否则未获取到。

        except Exception as e:
            print("\033[0;31;0m HOSTGROUP CREATE ERROR\033[0m")
            raise Exception

    def template_get(self,templateName=''):
        data = json.dumps({
            "jsonrpc": "2.0",
            "method": "template.get",
            "params": {
                "output": "extend",
                "filter": {
                    "name": templateName
                }
            },
            "auth": self.auth,
            "id": 50,
            })
        try:
            response = requests.get(url=self.url, headers=self.headers, data=data, timeout=2)
            # hosts_count=len(response.json().get('result',''))
            # print('l',hosts)
            return response.json()   # len(ret.get('result'))为1时获取到,否则未获取到。

        except Exception as e:
            print("\033[0;31;0m Template GET ERROR\033[0m")
            raise Exception

    def host_create(self,hostname,hostip,hostGroupName,templateName):
        '''
        创建host,并分配分组,关联模版
        host_create('host3','1.1.1.1','gp1 test,gp2 test','Template App FTP Service,Template App HTTP Service')
        :param hostname: 'host3'
        :param hostip: '1.1.1.1'
        :param hostGroupName: 多个组逗号分割'gp1 test,gp2 test'
        :param templateName: 多个模版都逗号分割'Template App FTP Service,Template App HTTP Service'
        :return:
        '''
        # 判断主机名是否重复。 zabbix不允许主机名重复
        find_hostname=self.host_get(hostname)
        if  len(find_hostname.get('result')):
            print("###recheck### hostname[%s] exists and return"%hostname)
            return 1

        # 判断template是否存才,不存在退出。 否则初始化备用
        template_list = []
        for t in templateName.split(','):
            find_template = self.template_get(t)
            if not len(find_template.get('result')):
                # template不存在退出 # 一般因为输错关系
                print("###recheck### template[%s] not find and return " %t)
                return 1

            tid=self.template_get(t).get('result')[0]['templateid']
            template_list.append({'templateid':tid})

        # 判断hostgroup是否存在。 不存在则创建。 并初始化hostgroup_list备用
        hostgroup_list=[]
        for g in hostGroupName.split(','):
            find_hostgroupname = self.hostgroup_get(g)
            if not len(find_hostgroupname.get('result')):
                # hostgroupname 不存在,创建
                self.hostgroup_create(g)
            #{'jsonrpc': '2.0', 'result': [{'groupid': '15', 'name': 'linux group 1', 'internal': '0', 'flags': '0'}],'id': 1}

        # for g in hostGroupName.split(','):
        #     print(self.hostgroup_get(g).get('result'))
            gid=self.hostgroup_get(g).get('result')[0]['groupid']
            hostgroup_list.append({'groupid':gid})

        #
        # print("## 测试组信息 ##")
        # print(hostgroup_list)
        # print(template_list)

        data = json.dumps({
            "jsonrpc": "2.0",
            "method": "host.create",
            "params": {
                "host": hostname,
                "interfaces": [
                    {
                        **"type": 2,     #接口类型1代表agent接口,接口类型2代表SNMPV2接口**
                        "main": 1,
                        "useip": 1,     #1表示使用ip 
                        "ip": hostip,
                        "dns": "",
                        "port": "161"   #端口
                    }
                ],
                "groups": hostgroup_list,
                "templates": template_list,
            },
            "auth": self.auth,
            "id": 1
            })

        try:
            response = requests.get(url=self.url, headers=self.headers, data=data, timeout=2)
            # hosts_count=len(response.json().get('result',''))
            # print('l',hosts)
            print("执行返回信息: 添加HOST[%s,%s]完成"%(hostname,hostip))
            return response.json()   # len(ret.get('result'))为1时获取到,否则未获取到。

        except Exception as e:
            print("\033[0;31;0m HOST CREATE ERROR\033[0m")
            raise Exception


def unittest():
    # zabbix = ZabbixApi(ip, user, password)
    # print("login success")
    # # 获取主机测试
    # hostsinfo=zabbix.host_get()
    # hostinfo = zabbix.host_get(hostname='gateway')
    # print(hostinfo)
    # print(len(hostinfo.get('result')))  # 获取到结果时为1 否则为0
    # # 获取/创建hostgroup测试
    # groupinfo=zabbix.hostgroup_get('linux group 1')
    # print(groupinfo)
    # print(groupinfo.get('result')[0]['groupid'])
    # r=zabbix.hostgroup_create(hostGroupName='gt3')
    # print(r)
    # # 获取template测试
    # r=zabbix.template_get('Template App FTP Service')
    # print(r.get('result')[0]['templateid'])
    ## 添加测试
    # r=zabbix.host_create('testadd1','gp1','tmp1')
    # print(r)
    pass


if __name__ == '__main__':
    try:
        zabbix = ZabbixApi(ip, user, password)
        print("...login success...")
        # unittest()

        # 添加主机单台
        #zabbix.host_create('host7','1.1.1.1','gp1 test,gp2 test','Template App FTP Service,Template App HTTP Service')

        #批量添加主机(多个Trunk口),从文本serverlist_more.txt
        BASE_DIR = os.path.dirname(os.path.abspath(__file__))
        ADD_LIST= os.path.join(BASE_DIR,'serverlist.txt')
        with open(ADD_LIST,'r',encoding='utf-8') as f:
            for line in f:
                if len(line.strip()): #跳过空行
                    serverinfo=line.strip().split('#')
                    # # print(serverinfo[0].strip("'"),serverinfo[1].strip("'"),serverinfo[2].strip("'"),serverinfo[3].strip("'"))
                    # # print(serverinfo[0])
                    zabbix.host_create(serverinfo[0],serverinfo[1],serverinfo[2],serverinfo[3])

    except Exception as e:
        print(e)
        # print(zabbix.auth)

创建txt文件
serverlist _more.txt
内容为需要批量添加的交换机信息
添加监控交换机名称#IP#组,组#调用的模板
Test_10.1.1.1#10.1.1.1#Cisco Second Layer Switch#Temp_Cisco_SNMPv2

运行Python文件:
python hostadd_more.py
即可

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Zabbix 是一个企业级分布式开源监控解决方案。  Zabbix 软件能够监控众多网络参数和服务器的健康度、完整性。Zabbix 使用灵活的告警机制,允许用户为几乎任何事件配置基于邮件的告警。这样用户可以快速响应服务器问题。Zabbix 基于存储的数据提供出色的报表和数据可视化功能。  Zabbix 支持主动轮询(polling)和被动捕获(trapping)。Zabbix所有的报表、统计数据和配置参数都可以通过基于 Web 的前端页面进行访问。基于 Web 的前端页面确保您可以在任何地方访问您监控的网络状态和服务器健康状况。适当的配置后,Zabbix 可以在监控 IT 基础设施方面发挥重要作用。无论是对于有少量服务器的小型组织,还是拥有大量服务器的大企业而言,同样适用。  Zabbix 是免费的。Zabbix 是根据 GPL 通用公共许可证的第二版编写和发布的。这意味着产品源代码是免费发布的,可供公共使用。 本课程主要讲解以下方面: 1.  网络设备的监控,如 Dell R420、Juniper ssg5等。2.  Linux 和 Windows 服务器的监控。3.  应用服务的监控,如 httpd、nginx等。4.  Zabbix 代理的配置与使用以及 Zabbix 的多种告警方式。 注意:该课程,需要有一定的 zabbixLinux 基础,建议您先把>和>看完,再看此套课程,这个是在它的基础上进行讲解的。                                                                   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值