Zabbix API (02)批量添加主机的实现

    批量添加主机的操作思路非常简单,首先试一下单独加一台设备,试一下没问题就写个函数,然后把设备IP等信息写道excel文件里(推荐CSV,python自带csv模块非常方便操作),然后写一个for循环,不断调用host creat函数就好了。还可以添加一些基础的判断,系统中是否已有相关的hostname或IP,hostgroup或template是否存在做一些冗错机制,再加上系统exception,完美。

    第一篇的文章里简单的介绍了如何用Crul 获取token,现在可以通过python实现了,通过requests模块和Zabbix API 进行交互。为了避免多次重复操作重复获取token对Zabbix服务器增加压力,可以采用requests的模块中的session方式,保持TCP的连接,多次发送请求,通过类的方法,类实例化的时候直接初始化这个session,在每个函数里面仍使用这个session收发数据。

# -*- coding: utf-8 -*-

#__author__胡菠萝汁

import requests

import json

import csv

headers = {

    'Content-Type': 'application/json'

}

class GetZabbix:

    def __init__(self):

        #用户信息

        self.username = "zabbix_api_name"

        self.password = "zabbix_api_pass"

        #Zabbix API URL更换IP

        self.url = "http://X.X.X.X/zabbix/api_jsonrpc.php"

        #初始化session

        self.s = requests.Session()

        #获取token

        self.token = self.getToken()

    #获取token的函数

    def getToken(self):

        data = {

            "jsonrpc": "2.0",

            "method": "user.login",

            "params": {

                "user": self.username,

                "password": self.password

            },

            "id": 1,

            "auth": None

        }

        r = self.s.post(url=self.url, headers=headers, data=json.dumps(data))

        token = json.loads(r.content).get("result")

        return token


一、确定添加Host所需要的信息

Zabbix API 通过host.creat来添加一个host,


host.creat

必要的参数有四个:Hostname, IP, group_id, template_id,默认监控方式是agent,我们主要用SNMP监控网络设备,因此tpye:2,port:161。几个必要参数中,Hostname和IP可以直接确定,但是grogroup_idup_id和template_id需要通过group_name和template_name通过API获取。因此需要另外两个函数用来获取group_id和template_id。下面代码已经添加了相关exception,并打印了一些信息,便于排错。如果不需要可以注释掉。

def getGrouId(self,group_name):

        data ={

            "jsonrpc": "2.0",

            "method": "hostgroup.get",

            "params": {

                "output": "extend",

                "filter": {

                    "name": group_name

                }

            },

            "auth": self.token,

            "id": 1

        }

        try:

            r = self.s.post(url=self.url, headers=headers, data=json.dumps(data))

            Group_Id = json.loads(r.content)["result"][0]["groupid"]

            print(Group_Id)

            print(r.content)

            return Group_Id

        except Exception as e:

            print(e)

            return False

    def getTemplateId(self,Templat_Nmae):

        data ={

            "jsonrpc": "2.0",

            "method": "template.get",

            "params": {

                "output": "extend",

                "filter": {

                    "host": Templat_Nmae

                }

            },

            "auth": self.token,

            "id": 1

        }

        try:

            r = self.s.post(url=self.url, headers=headers, data=json.dumps(data))

            Template_Id = json.loads(r.content)["result"][0]["templateid"]

            print(Template_Id)

            print(r.content)

            return Template_Id

        except Exception as e:

            print(e)

            return False


如果需求不大,只是把host添加到单独的group,使用单独的template的化,有一个‘little trick’可以使用以下,在Zabbix里面找到对应的group或者template,点击名称,可以在URL里面看到group或者template的id,如图:


group_id

二、host.creat 函数

准备好了相关信息就可以编写host.creat函数了。

哦,忘了判断host是否存在的函数,补上。

def get_host(self,host_name):

        data={

            "jsonrpc": "2.0",

            "method": "host.get",

            "params": {

                "filter": {

                    "host": host_name

                }

            },

            "auth": self.token,

            "id": 1

        }

        try:

            r = self.s.post(url=self.url, headers=headers, data=json.dumps(data))

            hostz_result = json.loads(r.content)["result"]

            if hostz_result ==[]:

                print("没有这个主机名,可以添加")

                return True

            else:

                print("已有主机")

                return False

            # print(Group_Id)

            print(r.content)

            # return Group_Id

        except Exception as e:

            print(e)

            return False

同样,也把host.creat函数加上,也添加相关exception。

def create_host_snmp(self,name,ip,groupname,templatename):

        data={

            "jsonrpc": "2.0",

            "method": "host.create",

            "params": {

                "host":name,

                "interfaces": [

                    {

                        "type": 2,

                        "main": 1,

                        "useip": 1,

                        "ip": ip,

                        "dns": "",

                        "port": "161"

                    }

                ],

                "groups": [

                    {

                        "groupid": self.getGrouId(groupname)

                    }

                ],

                "templates": [

                    {

                        "templateid": self.getTemplateId(templatename)

                    }

                ]

            },

            "auth": self.token,

            "id": 1

        }

        try:

            r = self.s.post(url=self.url, headers=headers, data=json.dumps(data))

            hostcreat_result = json.loads(r.content)["result"]

            print(name,"创建成功",hostcreat_result)

        except Exception as e:

            print(e,name,"创建失败")

三、文件读取信息,批量添加主机。

文件的信息基本就按照hostname、IP、hostgroup、template的顺序,每个host一列批量添加保存。然后写一个for循环,加上一些判断批量添加,大吉大利。

start = GetZabbix()

    with open('zabbix_host_add.csv', 'r') as zabbix_host_add_file:

        read_file = csv.reader(zabbix_host_add_file)

        for row in read_file:

            host_name=row[0]

            print(start.get_host(host_name))

            host_ip = row[1]

            group_name=row[2]

            template_name=row[3]

#判断是否可以加

            if start.get_host(host_name):

                if start.getGrouId_session(group_name):

                    if start.getTemplateId("V-Space_PDU_WITH_TEMPERATURE"):

#添加主机

                        start.create_host_snmp(host_name,host_ip,group_name,template_name)

                    else:

                        print(host_name, "添加失败", "template: %s不存在" % template_name)

                else:

                    print(host_name,"添加失败","group: %s不存在"%group_name)

            else:

                print(host_name,"添加失败","hostname: %s已存在存在"%host_name)

在上面定义的函数中print()比较多,如果嫌乱的,把不必要的都删掉就好了。


成功输出会返回host_id

你可能感兴趣的:(Zabbix API (02)批量添加主机的实现)