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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容