Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> программы —> Nagios+Digitemp

Система оповещения о превышении допустимой температуры в серверной на основе связки Nagios + Digitemp.

Автор: Капитан.


     Статья описывает создание системы оповещения о превышении температуры в специальных помещениях на основе Nagios с использованием программы Digitemp.
    Процесс изготовления простейшего контроллера шины 1-Wire DS9097 для съёма показаний с датчика температуры DS1820  и установки программы Digitemp на FreeBSD подробно описан в статье http://www.lissyara.su/articles/mad_hands/computers/ds9097+ds1820/
    В статье http://www.lissyara.su/articles/freebsd/programms/mrtg+digitemp/ описано применение этого устройства для отображения графиков изменения температуры в помещении серверной. Однако, участь всё время пялиться в монитор, отслеживая момент, когда сломается кондиционер не совсем подходит для . . . (здесь могло бы быть Ваше резюме) ;). Представим себе ситуацию: мы сидим в последнюю тяпницу июля в кафе . . . , а где-то там перегреваются сервера . . . ЖУТЬ!

   Имеем
    Сервер с операционной системой  FreeBSD  8.1-RELEASE amd64 с установленной и настроенной системой  мониторинга Nagios (каминг сун). К COM-порту сервера подсоединен контроллер DS9097 с датчиком температуры DS1820,  на сервере установлена и настроена программа Digitemp.
   Как мы видели в предыдущей статье, с датчика DS1820 можно снять показания значения температуры в градусах Цельсия и в Фаренгейтах с точностью до сотых долей. Прозападные Фаренгейты и слишком точные
цельсии  нам не нужны (мы же не самогонку варим) – нам нужно целое число отражающее температуру в градусах Цельсия. Команда для получения нужного параметра выглядит так:
#/usr/local/etc/digitemp/digitemp -t 0 -q -o "%.C" \
-c /usr/local/etc/digitemp/.digitemprc

Теперь прикручиваем это всё к Nagios
  Немного лирики (теория). Для проверки какого-либо сервиса Nagios использует соответствующие программы/команды, которые описываются в файлах конфигурации примерно в таком виде:
define command
{
command_name проверить_чёта_там
command_line $USER1$/check_чёта.sh -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$
}

В данном примере переменные:
- USER1 соответствует местонахождению проверочных программ (обычно определяется в файле resource.cfg;
$USER1$=/usr/local/libexec/nagios

- HOSTADDRESS – адрес проверяемого узла;
- ARG1 – порог предупреждения (при превышении, которого статус проверяемого сервиса меняется на Warning);
- ARG2 – порог аварии (при превышении – статус Critical).

  Никто не запрещает писать свои команды со своими переменными.

    При выполнении, такая команда должна опросить сервис
чёта_там на узле HOSTADDRESS и получить от него какие-то данные. Эти данные сверяются со значениями порогов. В зависимости от результата проверки проверочная программа может завершиться с кодом:
0 – ОК всё нормально;
1 – Warning – превышено значение ARG1;
2 – Critical - превышено значение ARG2;
3 – Unknown – непонятки.

    Термин «превышение» я использовал чисто для наглядности, применительно к процессу наблюдения за перегревом. Ведь существуют и ситуации, когда важно знать - насколько что-то там понизилось.
    Адрес узла нам не нужен (мы проверяем помещение, а не какой-то сервер). Наша команда проверки температуры должна принимать на входе только значения порогов срабатывания оповещений и завершаться с выдачей показания текущей температуры и возвращать одно из трёх значений (0,1 или 2).
Простейший скрипт будет выглядеть следующим образом.
#!/bin/sh
T=`/usr/local/etc/digitemp/digitemp -a -q -o "%.C" -c /usr/local/etc/digitemp/.digitemprc`
if test `expr $2 - $T` -gt 0
then
echo "OK " $T
exit 0
fi

if [ `expr $T - $4` -gt 0 ]
then
echo "OVERHEAT " $T
exit 2
fi

echo "WARNING " $T
exit 1

Небольшие пояснения для тех, кто мало знаком с программированием на shell. Переменные могут быть только строковыми (string), т.е. запись
F=314

не создаст переменную $F, содержащую целое значение триста четырнадцать а, создаст строковую переменную $F, содержащую символы три, один и четыре. Для того чтобы выполнить какую-нибудь математическую операцию используют конструкцию вида:
‘expr $F

Переменные вида $число (в данном примере $2 и $4)в программах на shell соответствуют подстрокам (параметрам) перечисленным после указания самого исполняемого файла.
Если была запущена программа /гдетотам/прога –w 25 –c 30
Значения переменных переданных в программу «прога» будут
$1  
-w
$2    
25    
$3    
-c
$4    
30

Данный скрипт вполне рабочий, его можно использовать, но он не содержит никаких проверок входных данных, хотя, если вы пишите чисто для внутреннего применения, такой подход можно (да и то с натяжкой) применять на практике. Сколько уязвимостей находится/эксплуатируется каждый день из-за того, что кто-то в погоне за призрачной прибавкой в скорости поленился проверить входные данные.
Простейшая проверка $1 могла бы выглядеть примерно так
if [ "-w"=$1 ]
then
WARNLIM=$2
else
echo "Unknown input parameter"
exit 3
fi

Теперь пора перейти к практике.

Настраиваем Nagios.
Создаем команду проверки
#ee /usr/local/libexec/nagios/checkthermo.sh

#!/bin/sh
T=`/usr/local/etc/digitemp/digitemp -a -q -o "%.C" \
-c /usr/local/etc/digitemp/.digitemprc`
if  test `expr $2 - $T` -gt 0
        then
        echo "OK   " $T
        exit 0
fi

if [ `expr $T - $4` -gt 0 ]
        then
        echo "OVERHEAT   " $T
        exit 2
fi
echo "WARNING  " $T
exit 1

Возможные грабли:
Если вы используете сторонние скрипты (скачанные из интернета, например), убедитесь, что они действительно написаны на Shell. Линуксяторы используют BASH, и такой скрипт может у вас не заработать. В данном случае установите BASH из портов и поменяйте первую строку на
#!/usr/local/bin/bash

Делаем наш скрипт исполняемым
#chmod +x /usr/local/libexec/nagios/checkthermo.sh

Добавляем описание нашей команды и описание сервиса в конфигурационные файлы Nagios.
Описание команды
define command{
command_name check_thermal
command_line $USER1$/checkthermo.sh -w $ARG1$ -c $ARG2$
}

Описание хоста
define host{
use freebsd-server
host_name 0_THERMAL_0
alias thermal
address 172.17.254.119
hostgroups 101
parents monitor
icon_image gradusnik.png
statusmap_image gradusnik.png
}

    Для наглядности я сделал отдельный виртуальный хост для того, чтобы в таблице сервисов запись о состоянии температуры шла отдельной строкой, хотя это дело вкуса. В таблице хосты расставляются по алфавиту и, чтобы показания были сверху я название для хоста начал с нолика.
Теперь определим сервис
define service{
use generic-service
host_name 0_THERMAL_0
service_description Thermal_State
check_command check_thermal!-w 25 –c 28
contact_groups admins
icon_image gradusnik.png
}

    После того, как Nagios перечитает конфигурацию, уведомления о превышении температуры будут получать члены контакт группы admins. Что и требовалось.

    Теперь рассмотрим ситуацию, когда необходимо мониторить температуру в удалённом помещении (в серверной филиала, например) или, как в моём случае, нет возможности подцепить датчик напрямую к серверу наблюдения (низковольтный COM-порт или отсутствие такового вообще). Я подключил датчик к другому серверу, на котором было поднято приложение NRPE http://en.wikipedia.org/wiki/NRPE (Сервер, конечно на FreeBSD). В данном случае помещаем наш проверочный скрипт checkthermo.sh в папку /usr/local/libexec/nagios/ удалённой машины. В конфигурацию NRPE добавляются такие строки:
command[check_thermal]=/ usr/local/libexec/nagios/checkthermo.sh -w 25 -c 28
command[check_thermal3]=/usr/local/etc/digitemp/digitemp3.sh

вторая строка содержит ссылку на скрипт digitemp3.sh с таким содержанием
#!/bin/sh
/usr/local/etc/digitemp/digitemp -a -q -o "%.C" -c /usr/local/etc/digitemp/.digitemprc

С помощью него я получаю данные для MRTG.
У меня стоит опция
dont_blame_nrpe=0

поэтому входные параметры для команд я прописываю сразу на удалённой стороне. В данном случае описывать команду проверки не нужно, а описание проверки сервиса будет выглядеть так:
define service{
use generic-service
host_name 0_THERMAL_0
service_description Thermal_State
check_command check_nrpe2!check_thermal
contact_groups admins
icon_image gradusnik.png
}

    Изначально Nagios отправляет оповещения по почте, но кто мешает прикрутить smstools . . . Удачных выходных!



размещено: 2011-02-20,
последнее обновление: 2011-02-20,
автор: Капитан


SlaDER, 2011-02-23 в 9:18:55

Спасибо за статью! Но обычно в серверой есть UPS и температуру обычно с него снимают по snmp, плагин есть в репозитории.

Алексей, 2011-05-26 в 13:53:55

SlaDER спасибо на название плагина, могли бы и написать как называется)



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0422 секунд
Из них PHP: 24%; SQL: 76%; Число SQL-запросов: 77 шт.
Исходный размер: 31202; Сжатая: 8307