ZABBIX 4.2中的设备依赖性

时间:2019-05-23 13:08:39

标签: zabbix

假设在使用Zabbix 4.2时出现以下情况。我们有一个核心交换机,两个分布式交换机和20个访问交换机,其中分布式交换机连接到核心,每个分布式交换机连接10个访问交换机。我正在使用SNMP v2c和模板cisco开关(官方的一个)监视所有它们。现在出现了问题,因为我无法轻松地在zabbix中定义设备依赖性。轻松地说,我的意思是,如果分布式交换机出现故障,我想针对该设备而不是与其连接的所有访问交换机发出警报。我可以定义如下。更改每个设备的触发器,并使它们依赖于分布式交换机的相应触发器。但是,这太浪费时间了。我该怎么办?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

您是对的,没有一种简单的方法来设置这种依赖关系。

前段时间我不得不处理相同的情况,我编写了一个python依赖设置器,它使用“依赖主机组<->主主机”逻辑。

您可以对其进行修改以适合您的需要(有关依赖性目标,请参见masterTargetTriggerDescriptionslaveTargetTriggerDescription),它可以工作,但几乎没有错误检查:使用后果自负!

import csv
import re
import json
from zabbix.api import ZabbixAPI

# Zabbix Server endpoint
zabbixServer    = 'https://yourzabbix/zabbix/'
zabbixUser      = 'admin'
zabbixPass      = 'zabbix'
zapi = ZabbixAPI(url=zabbixServer, user=zabbixUser, password=zabbixPass)

# Hostgrop variables - to reference IDs while building API parameters
hostGroupNames  = []    # list = array
hostGroupId     = {}    # dict = associative array

# Csv file for dep settings - see the format:
"""
Hostgroup;Master
ACCESS_1;DistSwitch1
ACCESS_2;DistSwitch1
ACCESS_5;DistSwitch2
ACCESS_6;DistSwitch2
DIST;CoreSwitch1
"""
fileName        = 'dependancy.csv'
masterTargetTriggerDescription = '{HOST.NAME} is unavailable by ICMP'
slaveTargetTriggerDescription = '{HOST.NAME} is unavailable by ICMP|Zabbix agent on {HOST.NAME} is unreachable'

# Read CSV file
hostFile = open(fileName)
hostReader = csv.reader(hostFile, delimiter=';', quotechar='|')
hostData = list(hostReader)

# CSV Parsing
for line in hostData:
    hostgroupName = line[0]
    masterName = line[1]
    slaveIds = []

    masterId = zapi.get_id('host', item=masterName, with_id=False, hostid=None)
    hostGroupId = zapi.get_id('hostgroup', item=hostgroupName, with_id=False, hostid=None)
    masterTriggerObj = zapi.trigger.get(hostids=masterId, filter=({'description': masterTargetTriggerDescription}) )

    print "Group: " + hostgroupName + " - ID: " + str(hostGroupId)
    print "Master host: " + masterName + " - ID: " + str(masterId)
    print "Master trigger: " + masterTriggerObj[0]['description'] + " - ID: " + str(masterTriggerObj[0]['triggerid'])


    # cycle through slave hosts
    hostGroupObj = zapi.hostgroup.get(groupids=hostGroupId, selectHosts='extend')
    for host in hostGroupObj[0]['hosts']:

        #exclude master
        if host['hostid'] != str(masterId):
            print "  - Host Name: " + host['name'] + " - ID:  " + host['hostid'] + " - MASTER: " + str(masterId)

            # cycle for all slave's triggers
            slaveTargetTriggerObj = zapi.trigger.get(hostids=host['hostid'])
            #print json.dumps(slaveTargetTriggerObj)
            for slaveTargetTrigger in slaveTargetTriggerObj:
                # search for dependancy targets
                if re.search(slaveTargetTriggerDescription, slaveTargetTrigger['description'] ,re.IGNORECASE):
                    print "    - Trigger: " + slaveTargetTrigger['description'] + " - ID: " + slaveTargetTrigger['triggerid']
                    # Clear existing dep. from the trigger, then create the new dep.
                    clear = zapi.trigger.deletedependencies(triggerid=slaveTargetTrigger['triggerid'].encode())
                    result = zapi.trigger.adddependencies(triggerid=slaveTargetTrigger['triggerid'].encode(), dependsOnTriggerid=masterTriggerObj[0]['triggerid'])


    print "----------------------------------------"
    print ""

答案 1 :(得分:1)

我更新了Simone Zabberoni提供的代码,并将其重写以与Python 3,PyZabbix和YAML一起使用。

#!/usr/bin/python3
import re
import yaml
#https://pypi.org/project/py-zabbix/
from pyzabbix import ZabbixAPI

# Zabbix Server endpoint
zabbix_server    = 'https://zabbix.example.com/zabbix/'
zabbix_user      = 'zbxuser'
zabbix_pass      = 'zbxpassword'

# Create ZabbixAPI class instance
zapi = ZabbixAPI(zabbix_server)
# Enable HTTP auth
zapi.session.auth = (zabbix_user, zabbix_pass)

# Login (in case of HTTP Auth, only the username is needed, the password, if passed, will be ignored)
zapi.login(zabbix_user, zabbix_pass)

# Hostgrop variables - to reference IDs while building API parameters
hostGroupNames  = []    # list = array
hostGroupId     = {}    # dict = associative array
# yaml file for dep settings - see the format:
"""
pvebar16 CTs:
  master: pvebar16.example.com
  masterTargetTriggerDescription: 'is unavailable by ICMP'
  slaveTargetTriggerDescription: 'is unavailable by ICMP|Zabbix agent is unreachable for 5 minutes'
"""
fileName        = 'dependancy.yml'

with open('dependancy.yml') as f:
    hostData = yaml.load(f)

for groupyml in hostData.keys():
    masterTargetTriggerDescription = hostData[groupyml]['masterTargetTriggerDescription']
    slaveTargetTriggerDescription = hostData[groupyml]['slaveTargetTriggerDescription']
    masterName = hostData[groupyml]['master']
    hostgroupName = groupyml

    slaveIds = []

    masterId = zapi.host.get(filter={'host': masterName},output=['hostid'])[0]['hostid']
    hostGroupId = zapi.hostgroup.get(filter={'name': hostgroupName},output=['groupid'])[0]['groupid']
    masterTriggerObj = zapi.trigger.get(host=masterName, filter={'description': masterTargetTriggerDescription}, output=['triggerid','description'])

    print("Group: " + hostgroupName + " - ID: " + str(hostGroupId))
    print("Master host: " + masterName + " - ID: " + str(masterId))
    print("Master trigger: " + masterTriggerObj[0]['description'] + " - ID: " + str(masterTriggerObj[0]['triggerid']))

    # cycle through slave hosts
    hostGroupObj = zapi.hostgroup.get(groupids=hostGroupId, selectHosts='extend')
    for host in hostGroupObj[0]['hosts']:
        #exclude master
        if host['hostid'] != str(masterId):
            print("  - Host Name: " + host['name'] + " - ID:  " + host['hostid'] + " - MASTER: " + str(masterId))
            # cycle for all slave's triggers
            slaveTargetTriggerObj = zapi.trigger.get(hostids=host['hostid'])
            for slaveTargetTrigger in slaveTargetTriggerObj:
                # search for dependancy targets
                if re.search(slaveTargetTriggerDescription, slaveTargetTrigger['description'] ,re.IGNORECASE):
                    print("    - Trigger: " + slaveTargetTrigger['description'] + " - ID: " + slaveTargetTrigger['triggerid'])
                    # Clear existing dep. from the trigger, then create the new dep.
                    clear = zapi.trigger.deletedependencies(triggerid=slaveTargetTrigger['triggerid'])
                    result = zapi.trigger.adddependencies(triggerid=slaveTargetTrigger['triggerid'], dependsOnTriggerid=masterTriggerObj[0]['triggerid'])
    print("----------------------------------------")
    print("")