Как стать автором
Обновить

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

Время на прочтение5 мин
Количество просмотров7.1K
Прочитал вчера статью 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. После выполнения вышеприведенной команды это можно будет вернуть обратно.

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

Теперь вы будете первыми узнавать о том, что возникла проблема и исправлять ее еще до того, как ее заметил кто-либо из клиентов или руководства.
Теги:
Хабы:
Всего голосов 19: ↑19 и ↓0+19
Комментарии14

Публикации

Истории

Работа

Ближайшие события

22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань