Оповещение от 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. После выполнения вышеприведенной команды это можно будет вернуть обратно.

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

    Теперь вы будете первыми узнавать о том, что возникла проблема и исправлять ее еще до того, как ее заметил кто-либо из клиентов или руководства.
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 14
    • 0
      Хорошая статья, но меня вполне устраивает nagios + sms оповещение, через sms гетевей, а получить в 3 часа звонок как то двоякое ощущение будет с одной стороны это хорошо и нужно исправить, а с другой стороны в 3 часа ночи я спать хочу.
      • 0
        Я согласен — SMS лучше. Но когда мы считали, это выходило намного дороже чем звонки. Некоторые операторы, кстати, не тарифицируют звонки длительностью менее 6-ти или 10-ти секунд. Так что если не растягивать сообщение это может вообще ничего не стоить ;)
        • 0
          Ну я использую гетевей где цена смс: 0.017уе(0,5руб.) Россия и 0.02уе(0,6руб.) Украина, как по мне то это не сильно дорого.
          • 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

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