21 июня 2013 в 14:55

Оповещение о проблемах 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.
Владислав Росс @gag_fenix
карма
169,8
рейтинг 0,0
Программист
Похожие публикации
Самое читаемое Администрирование

Комментарии (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 выбрал :)

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