我正在尝试configurationIcinga来查询加载到我正在configuration的存储arrays中的硬盘的SMART状态。
我遇到的问题是当查询驱动器的OID是文本而不是数字时数组的响应。
./check_snmp -H 10.0.10.17 -P 2c -C public -o .1.3.6.1.4.1.24681.1.2.11.1.7.1 SNMP OK - "GOOD" |
处理check_snmp的输出时,我习惯于使用数字而不是string。 有没有人知道我可以创build一个关键或警告通知时,输出GOOD以外的任何东西都返回?
您当然已经知道, Nagios需要一个数字(0,1,2,3)作为启动命令的返回状态码。
如果$? 对于check_snmp命令总是返回0 ,我的build议是将自己的检查添加pipe和grep到check_snmp命令,如下所示:
./check_snmp -H 10.0.10.17 -P 2c -C public -o .1.3.6.1.4.1.24681.1.2.11.1.7.1 | grep GOOD
如果在输出中findGOOD返回0 (OK) ,否则返回1 (Warning) 。
您不能使用非数字值的股票check_snmp ; 你必须在check_snmp插件周围写一个包装,或者使用/编写一个检查string值的插件。 这就是为什么有数百个SNMP插件变种用于特定的硬件。 这个OID适用于QNAP NAS,对不对?
通常情况下,你会发现别人已经为你做了工作。 你可以直接使用这些插件之一,或者分叉它们:
如果您需要名称而不是数字(OID),则需要将这些OID转换为mib。 为特定目的(硬盘驱动器,路由器接口,服务等)下载所需的mib。 下载之后,请使用具有给定名称的脚本来达到此目的。 例如,如果我喜欢使用check_snmp来检查正常运行时间的病态,请执行以下操作: ./check_snmp -H iphosts -P 2c -C public -o sysUpTime.0然后您可以用mibs名称replace数字OID …这就是所有点
你必须写自己的脚本。
在这个脚本中,您可以使用check_snmp插件的以下选项:
-s,–string = STRING:如果STRING完全匹配,则返回OK状态(对于该OID)
-r,–ereg = REGEX:如果扩展正则expression式REGEX匹配,则返回OK状态(对于该OID)
-R,–eregi = REGEX:如果不区分大小写的扩展REGEX匹配,则返回OK状态(对于该OID)– invert-search:取反search结果(如果find则返回CRITICAL)
例如,我必须使用指定的OID来validation服务器上的3个硬盘的状态。 这个OID在一切正常时返回string“Normal”,当有问题时返回“Critical”,所以我的命令是:
./check_snmp -H <@IP> -C <community> -o .1.3.6.1.4.1.2.3.51.3.1.12.2.1.3.0 --invert-search -r "Critical" -o .1.3.6.1.4.1.2.3.51.3.1.12.2.1.3.1 -r "Critical" -o .1.3.6.1.4.1.2.3.51.3.1.12.2.1.3.2 -r "Critical" -o -l "Drive 0" -l "Drive 1" -l "Drive 2" -l "Drive 3"
当一切正常时它将会返回:
SNMP OK - Drive 0 "Normal" Drive 1 "Normal" Drive 2 "Normal" Drive 3 "Normal" |
当有问题时:
SNMP CRITICAL - Drive 0 "Normal" Drive 1 "Normal" Drive 2 "Normal" Drive 3 *"Critical"*
如果你想用数字代替string,你必须修改你的脚本发送给nagios的结果。 在我的情况下,我想要一个正常退出check_snmp的文本,正常状态的值为1,perfdata的临界值为0。 所以在我的脚本中,我喜欢这个:
... test="$(/usr/lib/nagios/plugins/check_snmp -H <snip> -C <snip> --invert-search -o .1.3.6.1.4.1.2.3.51.3.1.12.2.1.3.$i -r Critical)" if (echo $test | grep -q Critical); then #echo "Drive $i" = 0 texte+="Drive_$i CRITICAL, " perfdata+="Drive_$i=0 " crit=1 else #echo "Drive $i" = 1 texte+="Drive_$i Normal, " perfdata+="Drive_$i=1 " ... if [ $crit = 1 ] then resultat="CRITICAL: " result_code=2 else resultat="OK: " result_code=0 fi resultat+="$texte|$perfdata" echo $resultat exit $result_code
脚本的退出将是:
CRITICAL: Drive_0 Normal, Drive_1 Normal, Drive_2 Normal, Drive_3 Normal, Drive_4 Normal, Drive_5 Normal, Drive_6 Normal, Drive_7 Normal, Drive_8 CRITICAL, Drive_9 CRITICAL, Drive_10 CRITICAL, |Drive_0=1 Drive_1=1 Drive_2=1 Drive_3=1 Drive_4=1 Drive_5=1 Drive_6=1 Drive_7=1 Drive_8=0 Drive_9=0 Drive_10=0
在“|”的左边 该文本将出现在nagios,在右侧的磁盘perfdata的值。
nagios根据函数exit返回的值定义服务的状态