2 декабря 2011 в 15:04

Оповещение от Nagios по телефону через Asterisk

Прочитал вчера статью Google translate+Asterisk IVR и подумал — «Клёво! Можно пользоваться для быстрого создания звуковых файлов при заведении новых хостов и сервисов в Nagios!».

Затем задался вопросом, а описано ли где-то как настроить оповещения по телефону для Nagios? Погуглив немного я нашел пару статей, прочитал их и понял, что решения описанные там обладают рядом недостатков:
  • Nagios и Asterisk должны быть установлены на одном сервере.
  • Требуется локальная установка движка по синтезу речи.
  • Телефон админа «зашит» в скрипт и он получает ВСЕ уведомления.
Вот я и решил поделиться своим решением, которое использую уже не первый год. В общих чертах решение состоит в следующем. В нагиос создаются объекты contact с указанием номера телефона в параметре pager и команды notify-by-phone и host-notify-by-phone, которые запускают скрипт /etc/nagios3/notify_by_phone.sh с параметрами кому звонить и какой сервис упал. Скрипт, в свою очередь, по ssh передает параметры на Asterisk сервер.

На стороне Asterisk вместо бэша запускается скрипт /etc/asterisk/call_from_nagios.sh, который генерирует call files для Asterisk c переменной, содержащей список фраз, которые нужно озвучить. Вот в общем-то и все, дальше это описано в подробностях.

Я не буду здесь описывать процесс установки Nagios и Asterisk, предположим что оба этих сервиса у вас уже работают. Начнем с части Asterisk сервера. Создаем скрипт /etc/asterisk/call_from_nagios.sh:
#!/bin/bash
data=`cat <&0`
_TMP=/var/tmp
callfile="${_TMP}/nag_callfile_$$"
echo "`date '+%Y.%m.%d %H:%M:%S'` ${data}" >> ${_TMP}/nag.log
number=`echo "${data}" | cut -f 1 -d " "`
data=`echo ${data} | cut -f 1 -d ":" | cut -d " " -f 2-100 | tr "[:upper:]" "[:lower:]" | sed 's/ /\&/g' `

echo "Channel: Local/${number}@from-internal
Context: custom-nagios-say
Extension: s
Priority: 1
MaxRetries: 0
WaitTime: 40
Setvar: play=${data}
Account: NAGIOS
CallerId: \"NAGIOS\" <168>
" > $callfile

chmod 666 $callfile
mv $callfile /var/spool/asterisk/outgoing/

Создаем контекст в extensions.conf:
[custom-nagios-say]
exten => s,1,Answer()
exten => s,n,Wait(1)
exten => s,n,Set(CHANNEL(language)=nag)
exten => s,n,Playback(intro)
exten => s,n,Playback(${play})
exten => s,n,Playback(${play})
exten => s,n,Playback(end)
exten => s,n,Hangup()
Создаем директорию /var/lib/asterisk/sounds/nag/ и кладем в нее следующие файлы:
critical.mp3 — критичный
down.mp3 — недоступен
end.mp3 — подробная информация на email
host.mp3 — сервер
intro.mp3 — внимание!
problem.mp3 — проблема
service.mp3 — сервис
status.mp3 — статус
warning.mp3 — предупреждение
А так же названия серверов и сервисов. Сами файлы можно озвучить своим голосом или способом, описанном в топике, который навел меня на мысль об этой статье:
wget -U "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5" "http://translate.google.com/translate_tts?q=сервер&tl=ru" -O host.mp3
Далее варианта два: установить в Asterisk модуль format_mp3 или каждый файл конвертировать в удобоваримый астериску формат. Я предпочел первый способ, но для примера приведу команду для конвертации:
sox host.mp3 -r 8000 -c 1 host.wav
Теперь можно запустить тестовый звонок командой:
echo "168 PROBLEM Host ISP status DOWN" | /etc/asterisk/call_from_nagios.sh
После того, как вы выловили все косяки и добились получения звонка и проговаривания «Внимание! Проблема. Хост — интернет сервис провайдер. Статус — недоступен», можно перейти к следующему шагу и подготовить возможность получения оповещений по сети через ssh.

Генерируем отдельный ssh сертификат без passphrase:
ssh-keygen -t rsa -b 4096
Теперь содержимое id_rsa.pub добавляем в /root/.ssh/authorized_keys и добавляем в начало строки параметр command. Не забываем сделать
chmod 600  /root/.ssh/authorized_keys
Файл у нас будет выглядеть примерно так:
command="/etc/asterisk/call_from_nagios.sh" ssh-rsa AAAAB3NпропущеномногобуквA0PCGAC/8kZU= root@nagios
Опять проверяем следующей командой и идем дальше.
echo "168 PROBLEM Host ISP status DOWN" | ssh -l root -i id_rsa localhost

Теперь поработаем с сервером Nagios. Предположим, у нас есть некий контакт:
define contact{
	        contact_name                    vasea
	        alias                           Vasea Pupkin
	        service_notification_period     24x7
	        host_notification_period        24x7
	        service_notification_options    w,u,c,r
	        host_notification_options       d,r
	        service_notification_commands   notify-service-by-email
	        host_notification_commands      notify-host-by-email
	        email                           vasea@mydoamin.ru
	        }
Копируем его и немного модифицируем:
define contact{
	        contact_name                    vasea_phone
	        alias                           Vasea Pupkin phone
	        service_notification_period     dayhours
	        host_notification_period        dayhours
	        service_notification_options    w,c,r
	        host_notification_options       d,r
	        service_notification_commands   notify-by-phone
	        host_notification_commands      host-notify-by-phone
	        pager                           163
	        }
Здесь я заменил период уведомлений на daytime (предварительно описав директивой define timeperiod), который соответствует времени с 7-ми до 22-ух часов. Если Вася готов получать звонки и ночью, можно оставить 24x7. Ну и, собственно, добавил номер телефона 168. Я использую внутренние телефоны, а переадресация на мобильный настроена уже в самом астериске. Но, в принципе, можно указать и сразу номер мобильного.

Добавляем контакт vasea_phone в список ответственных лиц для соответствующего сервиса или в соответствующую contactgroup. Дальше создаем команды:
define command{
        command_name    notify-by-phone
        command_line    [ "$NOTIFICATIONTYPE$" = "PROBLEM" ] && /etc/nagios3/notify_by_phone.sh "$CONTACTPAGER$ $NOTIFICATIONTYPE$ Host $HOSTNAME$ Service $SERVICEDESC$ status $SERVICESTATE$ : $SERVICEOUTPUT$"
}

define command{
        command_name    host-notify-by-phone
        command_line    [ "$NOTIFICATIONTYPE$" = "PROBLEM" ] && /etc/nagios3/notify_by_phone.sh "$CONTACTPAGER$ $NOTIFICATIONTYPE$ Host $HOSTNAME$ status $HOSTSTATE$ : $HOSTOUTPUT$"
}
И сам скрипт /etc/nagios3/notify_by_phone.sh следующего содержания:
#!/bin/bash
data=$@
date=`/bin/date '+%Y.%m.%d %H:%M:%S'`
echo "${date} ${data}" >> /tmp/nag.log
echo "${data}" | ssh -i /etc/nagios3/id_rsa root@10.1.5.61
10.1.5.61 это IP адрес моего Asterisk сервера. А файл /etc/nagios3/id_rsa — это тот, который мы сгенерировали на сервере Asterisk. При первом подключении к новому серверу ssh запрашивает подтверждение перед занесением его фингерпринта в known_hosts. Поэтому, нам нужно стать пользователем nagios (если демон Nagios работает под этим пользователем, обычно это так) и вручную запустить скрипт /etc/nagios3/notify_by_phone.sh:
su - nagios
/etc/nagios3/notify_by_phone.sh 168 PROBLEM Host ISP status DOWN
Перед этим может понадобиться заменить /bin/false на /bin/bash в /etc/password для пользователя nagios. После выполнения вышеприведенной команды это можно будет вернуть обратно.

Вот и все! Может быть какие-то детали я упустил из виду. Если так — пишите в комментариях и я обновлю статью.

Теперь вы будете первыми узнавать о том, что возникла проблема и исправлять ее еще до того, как ее заметил кто-либо из клиентов или руководства.
Литницкий Александр @litnialex
карма
14,5
рейтинг 0,0
Похожие публикации
Самое читаемое Администрирование

Комментарии (14)

  • 0
    Хорошая статья, но меня вполне устраивает nagios + sms оповещение, через sms гетевей, а получить в 3 часа звонок как то двоякое ощущение будет с одной стороны это хорошо и нужно исправить, а с другой стороны в 3 часа ночи я спать хочу.
    • 0
      Я согласен — SMS лучше. Но когда мы считали, это выходило намного дороже чем звонки. Некоторые операторы, кстати, не тарифицируют звонки длительностью менее 6-ти или 10-ти секунд. Так что если не растягивать сообщение это может вообще ничего не стоить ;)
      • 0
        Ну я использую гетевей где цена смс: 0.017уе(0,5руб.) Россия и 0.02уе(0,6руб.) Украина, как по мне то это не сильно дорого.
        • 0
          а что за шлюз такой, можно поподробнее ))
          • 0
            ответил в ПМ
    • 0
      ну я так понимаю, доработав напильником можно выбрать определённый временной интервал. Ну плюс, например, в 7 утра вместо будильника присылать всё что накопилось за ночь. хехе
      • 0
        Можно, но за то смс пришла и с утра знаешь что было и что нужно сделать. А насчет вместо будильника присылать звонки такие, я представляю если сервер «падал» (может и не ваш, а у ДЦ допустим инет целую ночь падал) и вам эдак звонков 10 с утра, типа «сервер упал», «сервер работает» и так по кругу. Так что для меня смс гораздо проще))
        • 0
          у меня команды notify-by-phone отправляют уведомления только насчет проблем. А в самом нагиос есть же flipflop detection. Если сервер 10 раз за ночь падал, он не станет 10 раз звонить.
          • 0
            Оффтоп: кстате, а на заббикс такое есть?
            • 0
              Должно быть. А если и нет, можно по аналогии прикрутить.
      • 0
        Да, можно слегка пройтись напильником по call_from_nagios.sh и добавить проверку на время. Если ночь, то менять время изменения call file на ближайшие 7 часов утра. Asterisk смотрит на modify time файла и принимает его к испольнению только когда наступает это время.
  • 0
    … мало того что тебя почта зайо** так ещё и телефон будет :)
    • 0
      Что бы не зайо** нужно стремиться к тому, что бы сервисы, за которые ты отвечаешь работали стабильно. А если за сервис ответственен другой сотрудник, его и подключаешь к уведомлениям вместо себя.
  • 0
    Для тех кому не нравится «озвучка» от Google
    AT&T Natural Voices Text-to-Speech Demo

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.