今天的主题是官方模板的自动发现规则分析,在监控工作中常常会遇到一些可变化的OID值,也就是父OID+索引,而索引本身是变化的,如果监控设备数量固定,一个个写问题不大,但在规模增加到一定程度手动添加已然不现实,而且不太灵活,所以官方在2.X版本后新增加自动发现规则功能。

正文

在开始之前呢,首先我们要了解什么样的情况下需要用到自动规则,我举个例子,以端口名称为例。OID为1.3.6.1.2.1.31.1.1.1.1,该OID解释如下。




zabbix 测试设备snmp tarp zabbix snmp oid_键值

OID介绍



用snmpwalk测试,顺带还是提下snmpwalk的使用方法吧,斜体为变量,也就是你自己的环境

snmpwalk -v snmp版本 -c 团体字密码 IP地址 OID,如果没有snmpwalk,CentOS需要装net-snmp-utils,ubuntu环境需要装snmp。

snmwalk -v 2c -c huawei@123 10.240.43.2 1.3.6.1.2.1.31.1.1.1.1




zabbix 测试设备snmp tarp zabbix snmp oid_自定义_02


通过上图我们看到查询的结果有59条规则,如果用这个OID去加监控项一定有问题,得出是多个值,所以根本就不知道要检查什么。所以自动发现规则应运而生。

Interfaces SNMP

Zabbix 5.2版本模板名称叫Inerface SNMP,如果是5.2以下(不包含5.2)叫Template Module Interfaces SNMPv2。自动发现规则(Discover rules)位置如下图红框所示。


zabbix 测试设备snmp tarp zabbix snmp oid_键值_03


zabbix 测试设备snmp tarp zabbix snmp oid_键值_04

进入到该规则里


自动发现规则的内容与监控项很类似,需要注意的是SNMP OID项的固定格式

discovery[{#MACROS1},OID1,{#MACROS2},OID2....]
  • 名字(Name):自定义即可
  • 类型(Type):选择SNMP AGENT
  • 键值(Key):其实也可以随便写,方便记,但是在同一台设备里必须要保持唯一性。
  • SNMP OID:简单来说就是设备里各个组件的编码,例如windows里的注册表
  • 更新周期(Update interval):多久更新一次,如果监控项需要发现,可以在被监控主机里点击恶心excute now。
  • 自定义时间间隔(Custom intervals):可以更加灵活的控制更新
  • 资源周期不足(Keep lost resources period):这个中文翻译有点问题,这里的意思是代表如果该监控选项无法发现了,什么时候取消监控,如下图二


zabbix 测试设备snmp tarp zabbix snmp oid_取值_05

页面内容


zabbix 测试设备snmp tarp zabbix snmp oid_zabbix 监控项自动发现过滤_06

出现监控项无法自动发现保留周期


宏(Macros)

宏其实一直是zabbix比较关键的点,类似变量,格式为{$MACROS},值可以为文本,也可以为正则表达式,宏的名称也可自己随便取,例如下方的{$NET.IF.IFNAME.MATCHES}可以写成{$IFNAME.MATCHES},后面的取值就随意了,根据不同功能写,例如这里的{$NET.IF.IFNAME.MATCHES}对应的应该是接口名称,如果我只想匹配g0/0/1口,值就是g0/0/1,如果想匹配所有的g口,那值就是^g,关于正则表达式可以去百度上搜,有很多教程,不需要太复杂,能用就行。


zabbix 测试设备snmp tarp zabbix snmp oid_取值_07

该模板宏一览


过滤器(Filters)

上篇我们讲过,过滤器主要用于过滤一些不想要的规则,组成部分也很简单,就计算类型和宏。那么我们来解析下该模板里的过滤器,一共包含12个(正反6类)分别是

  • {#IFADMINSTATUS}(端口管理状态):是否为admin down
    {#IFALIAS}(端口描述)
    {#IFDESCR}(端口名称)
    {#IFNAME}(端口名称):这个和上面的重复了,理论上可以不要
    {#IFOPERSTATUS}(端口状态):down还是up
    {#IFTYPE}(端口类型):是千兆口还是百兆口还是vlan啥的,文末我会贴出该例子的OID详细解释。

那么为什么需要用到这么多参数,其实挺简单的,都是为优化监控项服务的,当然如果你的网络设备配置都是标准化,那就没这么折腾了,例如你的交换机上联口都是固定的,那么过滤就只需要一项,{#IFNAME}的宏取值只用写该端口即可。但是如果是非标,那么这些就大有用处了,你发现少一项就感觉很困难,我们一般筛选相关端口通过这4个维度

  • 端口名称
  • 端口类型
  • 端口描述
  • 端口状态

所以从这个角度思考,官方这个模板的自动发现规则的过滤器还是比较合理的。


zabbix 测试设备snmp tarp zabbix snmp oid_取值_08

过滤器一览


监控原型

监控原型里面对的就是生成相对应的监控项,原版有9个,和端口相关指标息息相关,分别是端口入出流量、端口类型、端口状态,端口入出错包、端口入出丢包、端口速率,其中个人感觉端口类型没有什么太大必要,当然有需要的可以监控起来。


zabbix 测试设备snmp tarp zabbix snmp oid_取值_09

原版监控原型一览


以Interface {#IFNAME}({#IFALIAS}): Bits received这个为例,需要注意的是Key和SNMP OID都带有{#SNMPINDEX}。


zabbix 测试设备snmp tarp zabbix snmp oid_自定义_10

官方模板监控项原型一览


通过主机上查看该接口,有一段描述,ifindex:5


zabbix 测试设备snmp tarp zabbix snmp oid_zabbix 监控项自动发现过滤_11

主机获取


通过snmpwalk原OID+5可以获取到该接口的信息,那么到这里是不是就明白了自动发现规则的原理,其实zabbix里隐藏了两个宏,一个叫{#SNMPINDEX},一个叫{#SNMPVALUE},其中snmpindex就是这些具备同OID多个取值后的索引,而SNMPVALUE就是这些多个索引对应的取值,以下图为例,5为索引,10GE1/0/1为该索引的SNMPVALUE。Zabbix就是利用这个实现了自动发现规则的功能,当然代码级别实现肯定不会这么简单,但你要清楚前端的逻辑是什么,其次键值为什么要加这个,还记得我当初说的键值在同主机下要唯一,所以加上了该宏,保持键值唯一,其他的内容就基本没啥讲的


zabbix 测试设备snmp tarp zabbix snmp oid_zabbix 监控项自动发现过滤_12


最终效果


zabbix 测试设备snmp tarp zabbix snmp oid_键值_13

最终发现效果


总结

写了这么多,其实也为后面的制作自动规则服务的,其实大家可以大概的了解是怎么回事了,包括应用场景,可以想到还有框式设备多板卡,多CPU、Wlan等等,可以自己尝试写这些自动发现规则,简单来说流程是找到相对应的OID---监控指标确定---宏的定义---定义过滤器的规则---创建自动发现规则---创建监控原型---创建触发器---创建图形,最后用在设备里。还是那句话:路漫漫其修远兮,吾将上下而求索,我是IT小白Kasar,下期见!(下期制作自动发现规则)

附录


zabbix 测试设备snmp tarp zabbix snmp oid_键值_14

ifName


zabbix 测试设备snmp tarp zabbix snmp oid_自定义_15

ifHCInOctets


zabbix 测试设备snmp tarp zabbix snmp oid_自定义_16

ifHCOutOctets


zabbix 测试设备snmp tarp zabbix snmp oid_取值_17

ifAlias


zabbix 测试设备snmp tarp zabbix snmp oid_键值_18

ifDescr


zabbix 测试设备snmp tarp zabbix snmp oid_自定义_19

ifType


zabbix 测试设备snmp tarp zabbix snmp oid_zabbix 监控项自动发现过滤_20

ifSpeed


zabbix 测试设备snmp tarp zabbix snmp oid_取值_21

ifInDiscards


zabbix 测试设备snmp tarp zabbix snmp oid_自定义_22

ifInErrors


zabbix 测试设备snmp tarp zabbix snmp oid_自定义_23

ifOutDiscards


zabbix 测试设备snmp tarp zabbix snmp oid_取值_24

ifOutErrors