Оповещение о проблемах Zabbix по телефону через Asterisk

    Замечательная система мониторинга Zabbix предлагает «из коробки» несколько способов оповещения администратора о возникших проблемах: e-mail, SMS и Jabber.

    В этом топике я расскажу вам как подружить Zabbix и офисную АТС на основе Asterisk. Когда произойдет нештатная ситуация вам позвонит робот и проговорит сообщение с описанием проблемы.



    Зачем это нужно


    Оповещения по e-mail неплохо работают, когда их мало. При большом количестве писем возникает вероятность пропустить критическую ошибку. Поэтому логично настроить на e-mail оповещения по всем уровням проблем, а на SMS — только самые критичные.
    Но, к сожалению, не у всех коллег администраторов есть бюджет на покупку GMS-модема и оплату SMS. Отсылка SMS через онлайн сервисы не надежна, т.к. у нас может упасть канал в Интернет. А оповещение через свою АТС будет бесплатным. Вы сможете настроить звонок на внутренний номер в офисе, группу абонентов или на мобильный. Если АТС подключена к физической телефонной линии, то падение канала в Интернет ей будет не страшно.

    Как это работает


    В сети я нашел па ру примеров скриптов для решения этой задачи. Однако оба они обладают существенными недостатками: используют PHP (зачем?) и не умеют зачитывать текст сообщения — только стандартное сообщение, что есть какая-то проблема.

    Наш скрипт будет работать так:
    1. при возникновении alert Заббикс запускает bash-скрипт;
    2. bash-скрипт готовит call-файл для Asterisk и сообщение об ошибке в текстовом виде;
    3. файлы пересылаются по SCP на сервер Asterisk;
    4. по SSH на Asterisk запускается text2wave, зачитывающий текст в wav-файл;
    5. wav-файл и call-файл копируются в соответствующие папки Asterisk;
    6. Asterisk видит файлы, совершает звонок и проигрывает сообщение.

    Весь процесс занимает всего 1-2 секунды.

    Скрипт


    Заббикс умеет запускать скрипты при возникновении проблем. Скрипты лежат в папке, указанной в переменной AlertScriptsPath серверного конфига Заббикс.
    Как и все такие скрипты, наш скрипт должен принимать 3 параметра: адресат, тема сообщения, текст сообщения.

    #!/bin/bash
    # Asterisk сервер
    server="asterisk@pbx.roga-i-kopyta.com"
    
    # Уникальная метка
    ts=$(date +%s%N)
    
    # Создаем два файла
    txtname=/tmp/zabbix-alert.$ts.txt
    callname=/tmp/zabbix-alert.$ts.call
    
    # Наговариваемый текст. 
    # Приветствие. Запятые для паузы.
    echo "Zabbix alert,,,,,,,,,,,,,,,,," > $txtname
    # $2 - subject триггера. Можно поставить $3 - сообщение.
    echo "$2" >> $txtname
    
    # Call-файл Asterisk
    echo "Channel: Local/$1@from-internal" > $callname
    echo "Extension: s" >> $callname
    echo "MaxRetries: 2" >> $callname
    echo "RetryTime: 60" >> $callname
    echo "WaitTime: 30" >> $callname
    # С какого номера звоним
    echo "Callerid: 999" >> $callname
    echo "Application: Playback" >> $callname
    # Повторяем 3 раза
    echo "Data: zabbix-alert.$ts&zabbix-alert.$ts&zabbix-alert.$ts" >> $callname
    
    scp $txtname $server:$txtname
    scp $callname $server:$callname
    rm -f $txtname
    rm -f $callname
    ssh $server "cat $txtname | /usr/bin/text2wave -F 8000 > /var/lib/asterisk/sounds/zabbix-alert.$ts.wav && mv $callname /var/spool/asterisk/outgoing/ && rm -f $txtname && find /var/lib/asterisk/sounds/ -name 'zabbix-alert*' -type f -mmin +10 -delete"
    


    Настраиваем серверы


    Тут все зависит от используемой вами ОС/дистрибутива, поэтому 100% точных рекомендаций дать не могу.
    Если вкратце, во-первых, нам нужно на Asterisk установить программу text2wave (пакет Festival), по желанию установить русский голос.
    Во-вторых, нужно настроить беспарольную SSH аутентификацию между Zabbix и Asterisk. Можно воспользоваться этой инструкцией (пп. 1-6). Ключ придется сделать без passphrase. Вы можете настроить аутентификацию как для пользователей, под которыми работают Zabbix и Asterisk, так и завести других, но во втором случае в скрипте надо будет использовать sudo.
    Также проследите, чтобы у Asterisk были все права на создаваемый call-файл.
    Если нужно, заведите отдельный extension, с которого будет происходить звонок.

    После того, как все настроено, можно проверить работу скрипта запустив его из консоли:
    ./call_sip.sh номер "текст" ""
    Если не получается, ковыряем логи Zabbix, ssh и Asterisk. Я большую часть времени потратил как на раз на настройку sudo и ssh.

    Настраиваем Zabbix


    Самое простое:
    В Administration — Media types создаем новый тип оповещения.


    У нужных пользователей (Administration — Users) в закладке Media указываем их телефон. Это может быть как внутренний номер, так и мобильный — в соответствие с планом набора вашей АТС.

    В Actions редактируем или создаем новое действие, указав оповещаемых пользователей. Я рекомендую заголовок сообщения установить в {TRIGGER.STATUS} {TRIGGER.NAME} {HOSTNAME}, чтобы было понятно на какой машине произошла беда.

    Итого


    Мы получили еще один канал оповещения администраторов в дополнение к e-mail и SMS.
    • +19
    • 16,2k
    • 6
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 6
    • 0
      делал точно такую же штуку лет пять назад :)
      • 0
        Скажите, а почему вы не использовали ami для данной задачи:
        — Делаете originate
        — Записав в переменную текст ошибки, звонок пройдёт по dialplan'у, сгенерирует звуковой файл, проиграет его

        То есть в данном случае вам необходимо сделать доступ на asterisk по ami протоколу. Весь остальной функционал происходит локально на сервере с астером.
        • 0
          Да я «не настоящий сварщик» — не специалист по Asterisk.
          Мне проще подкинуть call-файл, чем разбираться с AMI. Я так понимаю, в этом случае понадобится писать код, например, на PHP?
          • +1
            Да, что то вроде:

            $asm = new AGI_AsteriskManager();
              if($asm->connect())
              {
                $call = $asm->send_request('Originate',
                        array('Channel'=>"SIP/$number",
                              'Context'=>'default',
                              'Priority'=>1,
                              'Callerid'=>$number));
                $asm->disconnect();
              }
            


            Взял первый попавшийся пример из гугла :)
            Вызов text2wave соответственно уже в диалплане, перед Dial'ом
          • 0
            ami менее безопасно чем ssh, без использования специального ami-proxy т.к. данные пересылаются в открытом виде по сети. Плюс call файлы очевидно проще в реализации.
            Да и нагрузка возникающая в данном случае настолько мала что не важно где будет выполняться какая то часть.
            • 0
              Я с вами полностью согласен, в плане безопасности ssh рулит :), даже если использовать SSL или прокси. Но с другой стороны — если грамотно настроить доступ, то риск минимальный. В плане реализации… ну для меня нет разницы, в данном случае я бы всё таки ami выбрал :)

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