Назад | Перейти на главную страницу

Выдавать предупреждения с текстовым выводом 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 возвращается?

Вы не можете использовать запас check_snmp с нечисловыми значениями; вам нужно либо написать обертку вокруг check_snmp плагин, или используйте / напишите плагин, который проверяет строковые значения. Вот почему существуют сотни вариантов подключаемых модулей SNMP для конкретного оборудования. Этот OID предназначен для NAS от QNAP, верно?

Обычно вы обнаружите, что кто-то уже сделал за вас эту работу. Вероятно, вы можете использовать один из этих плагинов как есть или выполнить их форк:

Вы наверняка уже знаете, что 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).

Если вам нужны имена вместо чисел (OID), вам необходимо преобразовать эти OID в mib. Загрузите необходимые mib-файлы для данной цели (жесткий диск, интерфейс маршрутизатора, службы и т. Д.). После загрузки попробуйте использовать для этой цели сценарий с заданным именем. например, если мне нравится использовать check_snmp для проверки времени безотказной работы, я делаю следующее: ./check_snmp -H iphosts -P 2c -C public -o sysUpTime.0 затем вы можете заменить номер OID на имя mibs ... это все точка

Вы должны написать свой собственный сценарий.

В этом скрипте вы можете использовать следующие параметры плагина check_snmp:

-s, --string = СТРОКА: Вернуть состояние ОК (для этого OID), если STRING - точное совпадение
-r, --ereg = REGEX: Вернуть состояние ОК (для этого OID), если расширенное регулярное выражение REGEX соответствует
-R, --eregi = REGEX: Возвращает состояние ОК (для этого OID), если расширенный REGEX без учета регистра соответствует --invert-search: Инвертировать результат поиска (КРИТИЧНО, если найден)

Например, мне нужно проверить состояние 3 жестких дисков на моем сервере с указанным OID. Этот OID возвращает строку «Нормальный», когда все в порядке, и «Критическое», если есть проблема, поэтому моя команда:

./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

У меня возникла та же проблема, как только мне пришлось установить предупреждение или критическое значение в виде строки, поэтому я просто использовал его с параметрами --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