Выдавать предупреждения с выводом текста check_snmp в Nagios
Я пытаюсь настроить Icinga для запроса 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. Кто-нибудь знает, как я могу создать критическое или предупреждающее уведомление, когда что-либо кроме вывода GOOD
возвращается?
4 ответа
Вы, конечно, уже знаете, что Nagios
нужен номер (0,1,2,3) в качестве кода состояния возврата из запущенной команды.
если $?
для check_snmp
команда всегда возвращает 0
, мой совет будет написать свой собственный добавление чека 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
Это вернется 0 (OK)
если слово GOOD
находится в выводе, в противном случае он вернется 1 (Warning)
,
Вы не можете использовать акции check_snmp
с нечисловыми значениями; Вы должны написать обертку вокруг check_snmp
плагин, или используйте / напишите плагин, который проверяет строковые значения. Вот почему существуют сотни вариантов плагинов SNMP для конкретного оборудования. Этот OID для NAS QNAP, верно?
Обычно вы обнаружите, что кто-то другой уже сделал эту работу за вас. Вы, вероятно, можете использовать один из этих плагинов как есть, или разветвить их:
У меня возникла та же проблема, как только мне пришлось установить предупреждение или критическое значение в виде строки, поэтому я просто использовал его с параметрами --invert-search и --ereg, например:
./check_snmp -P 3 -U monitoring_icinga -L authPriv -a SHA -x AES -A 'secr3t' --privpasswd='secr3t' 10.155.0.1 -o .1.3.6.1.4.1.25461.2.1.2.1.11.0 -r Non-functional --invert-search; echo $?
SNMP OK - "active" |
0
./check_snmp -P 3 -U monitoring_icinga -L authPriv -a SHA -x AES -A 'secr3t' --privpasswd='secr3t' 10.155.0.1 -o .1.3.6.1.4.1.25461.2.1.2.1.11.0 -r active --invert-search; echo $?
SNMP CRITICAL - *"active"* |
2
попробуй это:
./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 --ereg GOOD --invert-search
Если вам нужны имена вместо цифр (OID), вам нужно конвертировать эти OID в MIB. Загрузите необходимые mib-файлы для данной цели (жесткий диск, интерфейс маршрутизатора, службы и т. Д.). После загрузки попробуйте использовать скрипт с заданным именем для этой цели. например, если мне нравится использовать check_snmp, чтобы проверить время безотказной работы, я сделаю это: ./check_snmp -H iphosts -P 2c -C public -o sysUpTime.0
затем вы можете заменить число OID на имя MIBS... это все
Вы должны написать свой собственный сценарий.
В этом сценарии вы можете использовать следующие параметры плагина check_snmp:
-s, --string = STRING: вернуть состояние OK (для этого OID), если STRING является точным соответствием
-r, --ereg=REGEX: вернуть состояние OK (для этого OID), если расширенное регулярное выражение соответствует REGEX
-R, --eregi=REGEX: возвращать состояние OK (для этого OID), если расширенный регистр без учета регистра совпадает --invert -search: инвертировать результат поиска (CRITICAL, если найден)
Например, я должен проверить состояние 3 жесткого диска на моем сервере с указанным OID. Этот OID возвращает строку "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"*
Если вы хотите иметь числа вместо строк, вы должны изменить результаты, которые ваш скрипт отправит на nagios. В моем случае я хотел текст с нормальным выходом check_snmp и значением 1 для нормального состояния и 0 для критического значения для perfdata. Так что в моем сценарии я сделал так:
...
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