Zabbix批量增加节点方法(自动发现及Json API)

       在网上查阅了一些资料,Zabbix批量添加节点主要有以下几种方法:一是通过Zabbix管理页面,配置自动发现规则来发现并自动添加节点,配置Action配置来进行模板关联;二是可以通过Zabbix提供的Json API编写程序实现批量添加(可同时关联模板)、删除节点等管理功能;三是可以先导出一份节点的xml配置,然后通过程序修改xml,最后再导入修改后的xml配置来实现。

       其中方法一操作相对简便,无需其他辅助工具,Json API优点是可以精确管理节点,不会因为设置的IP范围比较粗略而添加不必要的节点。同时可以自动关联模板,实现一键配置。此外Json API功能强大,几乎可以实现全部管理功能。

1. 自动发现节点

       登录Zabbix后,“Configuration”→“Discovery”→“Create discovery rule”。

       进入Discovery rules配置页面,如下图:

       名字随意,方便项目组识别和管理即可,这里最重要的是配置正确的IP范围,IP范围可以如上图通过“-指定一个范围,也可以写单个IP,为了避免发现多余的节点,建议将范围写得精确一点。其他设置项可以参考一个现有的配置项,如下图。

       完成上述配置后,即在“Monitoring”→“Discovery”选择自己刚刚配置的发现规则的名称来查看已经发现的节点,但此时节点还没有关联任何模板,无法实现性能监控功能。需要关联监控模板。

 

       “Configuration”→“Action”→“Create action”,注意“Event source选择Discovery。

       进入Action配置页面:

       在“Conditions”里要关联Discovery的配置;

       在“Operation”里,Operation type选择Link to templates,然后选择要关联的模板。其实配置项,可以参考一个已有的配置项来完成。同样是在“Operation”里,可以配置hostgroup。

       至此,已经完成了节点配置并关联监控项模板,Zabbix配置已经基本完成。下面将介绍一下Json API方式管理

 

2. Json API

        Zabbix对外提供Json API来支持丰富的管理功能。为了简化编码,这里使用Python语言进行接口调用,实现了一个可以批量添加节点的功能。API文档可以在官网查到:https://www.zabbix.com/documentation/4.0/manual/api

示例代码如下:

#coding:utf-8
'''
By Tao 2019
'''
import json
import xlrd
import requests
import os

# 测试ok
class ZabbixTools(object):
    def __init__(self, ip):
        self.url = 'http://'+ip+'/zabbix/api_jsonrpc.php'
        #self.header = {"Content-Type":"application/json"} 
        self.header = {"Content-Type":"application/json-rpc"}
        self.auth = ''

    # 登陆验证
    def user_login(self, user, passcode):
        data = json.dumps({
                           "jsonrpc": "2.0",
                           "method": "user.login",
                           "params": {
                                      "user": user,
                                      "password": passcode
                                      },
                           "id": 1
                           })
        result = requests.post(self.url, data=data, headers=self.header)
        self.auth = json.loads(result.text)['result']
    
    # 退出登录
    def logout(self):
        data = json.dumps({
                           "jsonrpc": "2.0",
                           "method": "user.logout",
                           "params": [],
                           "id": 1,
                           "auth":self.auth
                           })           

        result = requests.post(self.url, data=data, headers=self.header)
        print(result.text)
    
    def get_host_by_name(self, hostName):
        data=json.dumps({
                "jsonrpc": "2.0",
                "method": "host.get",
                "params": {
                        "filter": {
                                "host": [
                                        hostName
                                        ]
                                }
                        },
                        "auth": self.auth,
                        "id": 1
                        })
        
        
    def get_hostgroupId(self, hostgroupName):
        data = json.dumps({
                           "jsonrpc":"2.0",
                           "method":"hostgroup.get",
                           "params":{
                                     "output": "extend",
                                     "filter": {
                                                "name": [
                                                         hostgroupName,
                                                         ]
                                                }
                                     },
                           "auth":self.auth,
                           "id":1,
                           })
        result = requests.post(self.url, data=data, headers=self.header)
        return json.loads(result.text)['result'][0]['groupid']
    
    def get_templateId(self, templateName):
        data = json.dumps({
                           "jsonrpc":"2.0",
                           "method": "template.get",
                           "params": {
                                      "output": "extend",
                                      "filter": {
                                                 "host": [
                                                          templateName,
                                                          ]
                                                 }
                                      },
                           "auth":self.auth,
                           "id":1,
                           })
        result = requests.post(self.url, data=data, headers=self.header)
        return json.loads(result.text)['result'][0]['templateid']
        
    def create_host(self, ip, groupid):
        data = json.dumps({
                "jsonrpc": "2.0",
                "method": "host.create",
                "params": {
                        "host": ip,
                        "interfaces": [{"type": 1,  "main": 1, "useip": 1, "ip": ip, "dns": "", "port": "10050"}],
                        "groups": [{ "groupid": groupid}],
                        "templates": [{"templateid": "10867"},{"templateid": "10105"}],
                        },
                "auth": self.auth,
                "id": 1})
        result = requests.post(self.url, data=data, headers=self.header)
        print(result.text)
        
    

if __name__ == '__main__':
    '''读Excel文件中的ip列表'''
    '''
    data = xlrd.open_workbook('ServerList.xlsx')
    #table = data.sheets()[0]
    table = data.sheet_by_name('Sheet1')
    zbt = ZabbixTools('22.188.120.250')
    zbt.user_login('Admin', 'zabbix')
    for i in range(table.nrows):
        zbt.create_host(table.cell_value(i,0))
    zbt.logout()
    os.system("pause")
    '''
    '''从Txt文件中读取ip列表'''
    zbt = ZabbixTools('22.188.120.250')
    zbt.user_login('Admin', 'zabbix')
    groupid = zbt.get_hostgroupId('ZabbixTest')
    with open('fulllist.txt', 'r') as f:        
        for line in f:            
            ip = line.replace('\n', '') 
            zbt.create_host(ip, groupid)
    zbt.logout()
    os.system("pause")
    '''
    zbt = ZabbixTools('22.188.120.250')
    zbt.user_login('Admin', 'zabbix')
    print(zbt.get_templateId('Redis'))
    zbt.create_host('22.188.188.12')
    zbt.logout()
    '''

       此处使用request模块进行http请求,代码比urllib模块要简单。grouid和templateid貌似在管理页面上看不到,所以这里提供了根据group名称和template名称查id的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值