Я пытаюсь настроить 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