Настройка мониторинга температуры в серверной

Настал момент когда захотелось удаленно мониторить температуру в серверной, а также следить за тем как холодит кондиционер.
Следить за температурой мы будем с Linux-хоста в котором есть COM(RS-232)-порт. Если таковой отсутствует, то можно приобрести переходник USB->RS232
Для измерения температуры используются датчики температуры DS1820 от Dallas

Схема подключения датчика DS1820
Схема подключения датчика DS1820

На этой схеме:
Два диода Шотки 1N5818
Стабилитрон 1N5228 3.9 V
Стабилитрон 1N5234 6.2 V
Резистор 1.5 кОм.
9 -pin’овый разъем ( для подключения к Com – порту материнской платы )
При данной реализации схемы мы используем всего 2 провода для подключения датчика (земля и питание закорочены), что уменьшает количество используемых датчиков и максимальную длину кабеля, по данным из интернета – такая схема может вытягивать 10датчиков на длине 60м. Собственно мне больше и не нужно 🙂

Схема в сборе

Схему я спаял на плате и поместил в корпус RS232 разьема.
Фото:

Деталей не много потому все получилось компактно
Деталей не много потому все получилось компактно

Схемка в сборе
Схемка в сборе

Установка и настройка Digitemp

Для сбора информации с датчиков используется программа Digitemp
Установка программы в Gentoo :

USE="ds9097" emerge digitemp

Установка программы в Ubuntu :

apt-get install digitemp

Теперь попробуем инициализировать датчики:

digitemp_DS9097 -i -s /dev/ttyS0
В ответ нам выдаст:
......
Searching the 1-Wire LAN
10FBF32C020800C2 : DS1820/DS18S20/DS1920 Temperature Sensor
ROM #0 : 10FBF32C020800C2
Wrote .digitemprc

Собственно все замечательно.
Примечание: Если подключать схему через USB-переходник. то необходимо в системе установить libusb и включить в ядре

USB_SERIAL=y

а так-же выбрать правильный драйвер. Я не мучался и включил поддержку для почти всех USB-контроллеров.
При этом инициализация датчиков происходит где-то так:

digitemp_DS9097 -i -s /dev/ttyUSB0

Продолжаем……
После того как датчики инициализировась необхимо с них снимать показания:

 digitemp_DS9097 -a -s /dev/ttyS0 
DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
Jul 01 17:26:27 Sensor 0 C: 18.62 F: 65.53

Тут помимо температуры вываливается куча спама, чтоб его отсеять:

digitemp_DS9097 -t 0 -s /dev/ttyS0 -q -o "%.2C"

Собственно вот и температура….. но теперь ее нужно как-то визуализировать… тут 2 варианта:
– с помощью rrdtool рисовать графики по показаниям
– передавать данные о температуре по SNMP в Cacti

Реализуем оба варианта.

Создание графика температуры с помощью RRDTool

Для рисования с помощью rrdtool необходимо установить его 🙂 а так-же иметь настроеный веб-сервер (о его настройке можно почитать в инете)

Создаем скрипт отрисовки
cat /script/temperature/get.sh

#!/bin/bash
# переходим в каталог скрипта
cd /script/temperature/
 
# Команда для получения текущей температуры с датчика!
SENSOR=`digitemp_DS9097 -t 0 -s /dev/ttyUSB0 -q -o "%.2C"`
 
RRDTOOL=/usr/bin/rrdtool
 
# Путь к базе, в которой храниться температура
DATABASE=/script/temperature/space-temperature.rrd
 
# Периодичность поступления данных в базу (сек) - соответственно должен быть настроен CRON
PERIOD=60
 
# Путь к папке, в которой будут лежать изображения с графиками зависимости, каталог web-сервера.
IMAGE_PATH=/var/www/xxxx.com.ua/weather/
#Сохраняем значение в файл
echo $SENSOR > $IMAGE_PATH/temp.txt
 
# Горизонтальная надпись в заголовке графика
TITLE_TEXT='Температура'
 
# Горизонтальная надпись в легенде под графиком
UNDER_TEXT='Статистика температуры'
 
# ========= ШАГ 1. Запись в базу данных полученных значений температуры ======
 
# Проверяем, присутствует ли вообще база для температуры. Если нет - создаём
 
if ! [ -f $DATABASE ]
        then
                $RRDTOOL create $DATABASE -s $PERIOD DS:temperature:GAUGE:600:U:U \
                RRA:AVERAGE:0.5:1:576 \
                RRA:AVERAGE:0.5:6:672 \
                RRA:AVERAGE:0.5:24:732 \
                RRA:AVERAGE:0.5:144:1460
        fi
 
$RRDTOOL update $DATABASE N:$SENSOR
 
# ============================================================================
 
# Функция для построения зависимости температуры от времени
 
function DRAW_GRAPHIC
{
 
        # Определяем время, во сколько генерируется график
        NOW_HOUR=`date +%H`
        NOW_MIN=`date +%M`
        NOW_SEC=`date +%S`
 
        # На основе параметра 2, переданного функции вычисляем какой комментарий написать
        case $2 in
        day)
                 TIME_TEXT="за последние 24 часа"
                 ;;
        week)
                 TIME_TEXT="за последнюю неделю"
                 ;;
        month)
                 TIME_TEXT="за последний месяц"
                 ;;
        year)
                 TIME_TEXT="за последний год"
                 ;;
        esac
 
        $RRDTOOL graph $IMAGE_PATH/$1 \
        -s -1$2 \
        -e now \
        -a PNG \
        -v 'градусы Цельсия' \
        -t "$TITLE_TEXT $TIME_TEXT" \
        -r \
        -E \
        -i \
        -R light \
        --zoom 1 \
        -w 500 \
        -h 150 \
        --font DEFAULT:10:/usr/share/fonts/corefonts/arial.ttf \
        DEF:temperature=$DATABASE:temperature:AVERAGE \
        LINE2:temperature#33cc33 \
        GPRINT:temperature:LAST:'Текущая\:%2.1lf'\
        GPRINT:temperature:MIN:'Мин\:%2.1lf' \
        GPRINT:temperature:MAX:'Макс\:%2.1lf' \
        GPRINT:temperature:AVERAGE:'Средняя\:%4.1lf'
}
 
# ========= ШАГ 2. Отрисовка графиков зависимости температуры от времени ========
DRAW_GRAPHIC 'temp_d.png' 'day'
DRAW_GRAPHIC 'temp_w.png' 'week'
DRAW_GRAPHIC 'temp_m.png' 'month'
DRAW_GRAPHIC 'temp_y.png' 'year'

Добавляем в crontab наш скрипт:

*/1 * * * *     root    /script/temperature/get.sh

После того как сгенерировались графики, нужно их вывести на экран.
Для этого можно использовать простенькую страничку
cat /var/www/xxxxx.com.ua/weather/index.php

 <html>
<head>
<meta charset='utf8'>
<title> Temperature  </title>
</head>
<body bgcolor='#B8860B'>
<br>
<center> <h2><font face='Arial'>Температура в комнате</font></h2>
 
<?php
$text = file_get_contents( "temp.txt" );
?>
 
<center> <h1><font color="#FFFFFF" face='Arial'><?php print $text ?> C&#176;</h1></font>
<br><br>
<center> <img src='temp_d.png'> </center><br>
<center> </h2> <img src='temp_w.png'> </center><br>
<center> <img src='temp_m.png'> </center><br>
<center> <img src='temp_y.png'> </center>
</body>
</html>

Пример отрисовки http://weather.21th.com.ua/
Температура в комнате


Мониторинг с помощью Cacti

Будем считать, что Cacti уже установлен и настроен 🙂
Пишем небольшой скриптец который снимает показания с датчика температуры и выдает ее в stdout
cat /scripts/checktemp

#!/bin/bash
digitemp_DS9097 -t 0 -s /dev/ttyS0 -q -o "%.2C" | tail -n 1

Теперь нужно обьяснить утилите SNMP откуда брать температуру и в какой oid выкладывать значения.
Для этого нужно в файл /etc/snmp/snmpd.conf добовить такую строчку:

......
extend .1.3.6.1.4.1.2021.2000.1 temp0 /scripts/checktemp

Перезапускаем SNMP

/etc/init.d/snmpd restart

Проверяем выдаются ли наши значения по запросу:

snmpwalk -v1 -c public 10.0.0.198 .1.3.6.1.4.1.2021.2000.1
UCD-SNMP-MIB::ucdavis.2000.1.1.0 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.2000.1.2.1.2.5.116.101.109.112.48 = STRING: "/scripts/checktemp"
UCD-SNMP-MIB::ucdavis.2000.1.2.1.3.5.116.101.109.112.48 = ""
UCD-SNMP-MIB::ucdavis.2000.1.2.1.4.5.116.101.109.112.48 = ""
UCD-SNMP-MIB::ucdavis.2000.1.2.1.5.5.116.101.109.112.48 = INTEGER: 5
UCD-SNMP-MIB::ucdavis.2000.1.2.1.6.5.116.101.109.112.48 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.2000.1.2.1.7.5.116.101.109.112.48 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.2000.1.2.1.20.5.116.101.109.112.48 = INTEGER: 4
UCD-SNMP-MIB::ucdavis.2000.1.2.1.21.5.116.101.109.112.48 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.2000.1.3.1.1.5.116.101.109.112.48 = STRING: "17.94"
UCD-SNMP-MIB::ucdavis.2000.1.3.1.2.5.116.101.109.112.48 = STRING: "17.94"
UCD-SNMP-MIB::ucdavis.2000.1.3.1.3.5.116.101.109.112.48 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.2000.1.3.1.4.5.116.101.109.112.48 = INTEGER: 0
UCD-SNMP-MIB::ucdavis.2000.1.4.1.2.5.116.101.109.112.48.1 = STRING: "17.94"

Собственно в последней строке и есть наша температура в серверной.
Теперь научим Cacti брать эту температуру и строить график.
Заходим в настройки нашего хоста и добавляем Add Graph Template:SNMP – Generic OID Template

SNMP - Generic OID Template
SNMP - Generic OID Template

Переходим в раздел “Create Graphs for this Host” , создаем график на основе шаблона

Create: SNMP - Generic OID Template
Create: SNMP - Generic OID Template

Появится окно настроек нового графика:

Настройки SNMP - Generic OID Template
Настройки SNMP - Generic OID Template

В разделе Custom Data нужно ввести значение oid в котором хранится наша температура.
Его полная запись :

 

extend .1.3.6.1.4.1.2021.2000.1 temp0 /scripts/checktemp
+
UCD-SNMP-MIB::ucdavis.2000.1.4.1.2.5.116.101.109.112.48.1 = STRING: “17.94”
=
.1.3.6.1.4.1.2021.2000.1.4.1.2.5.116.101.109.112.48.1
Полученое значение вставляем в наше поле.
В итоге получаем такой график:

Температура в серверной
Температура в серверной

Воть так вот 🙂
Но и это не все! ))))
А если ЧП? Админы во сне графики не видят…. и нужно их как-то уведомить о происходящем.
Проще простого.

Голосовое оповещение о температуре в серверной

Пишем-с скрипт:
cat temp_warn.sh

#!/bin/bash
cd /scripts
TEMP=`/bin/bash checktemp | cut -b1-2`
echo $TEMP
if [ $TEMP -gt 33 ]
then
    echo "Temperature in DataCenter is "$TEMP
        cp /scripts/callfile  /var/spool/asterisk/outgoing/
        sendEmail -f server@corp.ua -t admins@corp.ua -u "Message from DataCenter №1" -m "Temperature in DataCenter is critical "$TEMP -s smtp.corp.ua:25 -xu server@corp.ua -xp password
fi

Файл checktemp мы используем описаный выше. В результате если температура поднимется выше 33градусов, то всем (ответственным) админам отправится сообщение на почту + выполнится звонок на мобильный телефон.
Звонок на мобильный происходит когда специально подготовленый файл callfile помещается в каталог исходящих звонков Asterisk‘a
Содержимое файла:
cat callfile

Channel: DAHDI/g1/Se0501113355
Application: Playback
Data: temp-warning

temp-warning – это подготовленый звуковой файл который лежит в /var/lib/asterisk/sounds/en/

Настройка мониторинга температуры в серверной: 2 комментария

  1. [code]USE=”ds9097″ emerge digitemp[/code]
    Лучше заранее создать /etc/portage/package.use/digitemp с содержимым
    [code]app-misc/digitemp ds9097[/code]
    Если использовать USE прямо во время сборки, при обновлении системы будут проблемы 🙂

Добавить комментарий