我有一台思科和一台装有 icinga(又名 nagios、thruk)的监控服务器。我想从思科接收陷阱并在 icinga 中显示它们。但我无法看到 errdisable 陷阱的接口和 vlan。
我从 cisco 下载了 mib,包括 CISCO-ERR-DISABLE-MIB.my。然后我使用以下命令将其转换为 snmptt:
snmpttconvertmib --in=CISCO-ERR-DISABLE-MIB.my --out=snmptt.conf --exec='/bin/bash /usr/local/bin/trap/submit_check_result $r '"errdisable 2" -net_snmp_perl --format=4
产生了以下配置(我用...替换了 mib 的绝对路径,并用...替换了变量值):
#
#
#
#
MIB: CISCO-ERR-DISABLE-MIB (file:/.../CISCO-ERR-DISABLE-MIB.my) converted on Wed Sep 8 16:49:53 2021 using snmpttconvertmib v1.4.2
#
#
#
EVENT cErrDisableInterfaceEvent .1.3.6.1.4.1.9.9.548.0.1.1 "Status Events" Normal
FORMAT cErrDisableInterfaceEvent - cErrDisableIfStatusCause:$1
EXEC /bin/bash /usr/local/bin/trap/submit_check_result $r errdisable 2 "cErrDisableInterfaceEvent - cErrDisableIfStatusCause:$1 "
SDESC
The cErrDisableInterfaceEvent is generated when an interface
or {interface, vlan} is error-disabled by the feature
specified in cErrDisableIfStatusCause.
cErrDisableInterfaceEvent is deprecated and replaced by
cErrDisableInterfaceEventRev1.
Variables:
1: cErrDisableIfStatusCause
Syntax="INTEGER"
1: udld
...
9: portSecurityViolation
Descr="This object specifies the feature/event that caused the
{interface, vlan} (or the entire interface) to be
error-disabled."
EDESC
#
#
#
EVENT cErrDisableInterfaceEventRev1 .1.3.6.1.4.1.9.9.548.0.2 "Status Events" Normal
FORMAT cErrDisableInterfaceEventRev1 - cErrDisableIfStatusCause:$1
EXEC /bin/bash /usr/local/bin/trap/submit_check_result $r errdisable 2 "$N - $+1 "
SDESC
The cErrDisableInterfaceEventRev1 is generated when an
interface or {interface, vlan} is error-disabled by the
feature specified in cErrDisableIfStatusCause.
cErrDisableInterfaceEventRev1 deprecates
cErrDisableInterfaceEvent to make it RFC 2578 compliant.
According to section 8.5 of RFC 2578, the next
to last sub-identifier in the name of any newly-defined
notification must have the value zero.
Variables:
1: cErrDisableIfStatusCause
Syntax="INTEGER"
1: udld
...
9: portSecurityViolation
Descr="This object specifies the feature/event that caused the
{interface, vlan} (or the entire interface) to be
error-disabled."
EDESC
有两个陷阱,我只对 cErrDisableInterfaceEventRev1 感兴趣,而对已弃用的 cErrDisableInterfaceEvent 不感兴趣。
这是我用来生成测试 errdisable 事件的 send-errdisable.sh:
TO_HOST=icinga.example.com
community=abcabc
snmptrap -m ALL -v 2c -c $community $TO_HOST '' CISCO-ERR-DISABLE-MIB::cErrDisableInterfaceEventRev1 \
CISCO-ERR-DISABLE-MIB::cErrDisableIfStatusCause.2.0 i 1 \
2>/dev/null
现在,当我生成一个 errdisable 事件时,在 errdisable 服务的 icinga 插件输出中我得到以下文本:
cErrDisableInterfaceEventRev1 - cErrDisableIfStatusCause:udld
但我希望接口和 vlan 在那里,如下所示:
cErrDisableInterfaceEventRev1 - cErrDisableIfStatusCause.2.0:udld
为什么不显示?如何解决?
答案1
我不太清楚为什么它没有显示。我怀疑是 net_snmp_perl 转换器出了问题。
1.3.6.1.4.1.9.9.548.1.3.1.1.2.2.0
本案的OID事件由两部分组成:1.3.6.1.4.1.9.9.548.1.3.1.1.2
和.2.0
。
似乎 net_snmp_perl 在解析了 OID 事件的第一部分(在本例中它被解析为 cErrDisableIfStatusCause)后省略了事件 OID 的尾部(“.2.0”)。
但我已经找到了解决办法。
下列的这文章中,我发现我可以在 EXEC 行中写入什么来复制原始值。
打开生成的 snmptt.conf 并替换
EVENT cErrDisableInterfaceEventRev1 .1.3.6.1.4.1.9.9.548.0.2 "Status Events" Normal
FORMAT cErrDisableInterfaceEventRev1 - cErrDisableIfStatusCause:$1
EXEC /bin/bash /usr/local/bin/trap/submit_check_result $r errdisable 2 "cErrDisableInterfaceEventRev1 - cErrDisableIfStatusCause:$1 "
到
EVENT cErrDisableInterfaceEventRev1 .1.3.6.1.4.1.9.9.548.0.2 "Status Events" Normal
FORMAT Looks unimportant what you write here
EXEC /bin/bash /usr/local/bin/trap/submit_check_result $r errdisable 2 "$N - $+1 "
“$N” 是配置文件中的事件名称,在本例中为“cErrDisableInterfaceEventRev1”
“$+1” 是第一个变量名称及其值,在本例中为“cErrDisableIfStatusCause.2.0:udld”
因此现在发送测试陷阱在 icinga 中显示如下:
cErrDisableInterfaceEventRev1 - cErrDisableIfStatusCause.2.0:udld
这正是我们想要的。现在将 send-errdisable.sh 中的 .2.0 更改为例如 .3.1 也会在 icinga 中相应显示。