Настал момент когда захотелось удаленно мониторить температуру в серверной, а также следить за тем как холодит кондиционер.
Следить за температурой мы будем с Linux-хоста в котором есть COM(RS-232)-порт. Если таковой отсутствует, то можно приобрести переходник USB->RS232
Для измерения температуры используются датчики температуры DS1820 от Dallas
На этой схеме:
Два диода Шотки 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
Temperature
Температура в комнате
C°
Пример отрисовки 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
Переходим в раздел “Create Graphs for this Host” , создаем график на основе шаблона
Появится окно настроек нового графика:
В разделе 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/
[code]USE=”ds9097″ emerge digitemp[/code]
Лучше заранее создать /etc/portage/package.use/digitemp с содержимым
[code]app-misc/digitemp ds9097[/code]
Если использовать USE прямо во время сборки, при обновлении системы будут проблемы 🙂
Вкурсе, так и делаю, в данном случае просто лень было расписывать 🙂