Zabbix — оповещение по телефону через Asterisk

Thank you for reading this post, don't forget to subscribe!

Теория

  1. При воз­ник­но­ве­нии про­бле­мы zabbix сер­вер дол­жен выпол­нить bash скрипт, кото­рый нам и выпол­нит всю рабо­ту по совер­ше­нию звон­ка. Весь необ­хо­ди­мый функ­ци­о­нал в zabbix уже есть, нам нуж­но толь­ко напи­сать скрипт и всё настроить.
  2. Bash скрипт гене­ри­ру­ет из тек­ста ошиб­ки зву­ко­вой WAV файл и CALL файл для Asterisk.
  3. Bash скрипт загру­жа­ет по SCP на сер­вер Asterisk сге­не­ри­ро­ван­ные фай­лы, уста­нав­ли­ва­ет им нуж­ные пра­ва, поме­ща­ет в нуж­ные директории.
  4. Asterisk совер­ша­ет зво­нок и про­иг­ры­ва­ет сообщение.

Допол­ни­тель­ные условия:

  • Bash скрипт дол­жен чистить за собой ста­рые WAV фай­лы. Call фай­лы Asterisk почи­стит сам.
  • Bash скрипт не дол­жен зво­нить слиш­ком часто при мас­со­вом сбое. Основ­ная зада­ча — раз­бу­дить адми­нов, а не отпра­вить мак­си­маль­ное коли­че­ство звонков.
  • Долж­ны быть логи звонков.
  • Долж­на быть под­держ­ка рус­ско­го языка.
  • Долж­на быть воз­мож­ность тон­кой настрой­ки для каж­до­го поль­зо­ва­те­ля, о каких триг­ге­рах уве­дом­лять по телефону.

Подготовка серверов

WAV файл будем созда­вать на zabbix сер­ве­ре, пример:

Для пре­об­ра­зо­ва­ния тек­ста в аудио­файл нам пона­до­бит­ся пакет festival, для под­держ­ки рус­ско­го язы­ка допол­ни­тель­но уста­но­вим festvox-ru:

apt-get install festival festvox-ru

Создаю тек­сто­вый файл C:\wav\test.txt с тек­стом, кото­рый нуж­но пре­об­ра­зо­вать в WAV.

Содер­жи­мое фай­ла test.txt:

В под­си­сте­ме Linux он в /mnt/c/wav/test.txt.

Выпол­ня­ем:

cat /mnt/c/wav/test.txt | /usr/bin/text2wave -f 8000 -eval '(voice_msu_ru_nsh_clunits)' > /mnt/c/wav/test.wav

Немно­го о параметрах:

  • -eval '(voice_msu_ru_nsh_clunits)'
    При­ну­ди­тель­но вклю­ча­ем под­держ­ку рус­ско­го язы­ка из паке­та festvox-ru.
  • -f 8000
    Выход­ная часто­та. Для asterisk сле­ду­ет уста­нав­ли­вать имен­но 8000.

Полу­ча­ем нуж­ный нам файл test.wav:

 

Уста­нав­ли­ва­ем на zabbix сер­ве­ре библиотеки:

apt-get install festival festvox-ru uuid

  • festival — биб­лио­те­ка для гене­ра­ции зву­ко­во­го фай­ла из текста.
  • festvox-ru — под­держ­ка рус­ско­го язы­ка для festival.
  • uuid — в bash скрип­те я исполь­зую uuid для гене­ра­ции уни­каль­но­го име­ни файла.

В скрип­те я буду копи­ро­вать WAV и CALL фай­лы на asterisk по SCP. Нуж­но настро­ить бес­па­роль­ный вход по SSH от поль­зо­ва­те­ля zabbix на zabbix сер­ве­ре поль­зо­ва­те­лю root на asterisk сервере

А если корот­ко, то на zabbix сер­ве­ре под рутом:

ssh-keygen

На все вопро­сы жмём ввод, полу­ча­ем пару клю­чей. Копи­ру­ем пуб­лич­ный ключ на asterisk сер­вер (он у меня назы­ва­ет­ся freepbx):

scp ~/.ssh/id_rsa.pub root@freepbx:~/.ssh/authorized_keys

Пап­ку .ssh с клю­ча­ми пере­но­шу в домаш­нюю дирек­то­рию поль­зо­ва­те­ля zabbix на zabbix сер­ве­ре, пото­му что bash скрипт будет выпол­нять­ся от его име­ни, и SCP тоже.

 

Bash скрипт

В настрой­ках zabbix сер­ве­ра /etc/zabbix/zabbix_server.conf смот­рим что напи­са­но в пара­мет­ре AlertScriptsPath:

AlertScriptsPath=/usr/lib/zabbix/alertscripts

Рас­ком­мен­ти­руй­те пара­метр при необходимости.

У меня скрипт для уве­дом­ле­ний нахо­дят­ся по умол­ча­нию в дирек­то­рии /usr/lib/zabbix/alertscripts. Создаю в ней пустой файл для логов /usr/lib/zabbix/alertscripts/freepbxgate.log, поль­зо­ва­тель zabbix дол­жен иметь пра­ва на чте­ние и запись. B создаю bash скрипт /usr/lib/zabbix/alertscripts/freepbxgate.sh. Поль­зо­ва­тель zabbix дол­жен иметь пра­ва на чте­ние и выпол­не­ние. Содер­жи­мое скрипта:

 

На вход при­ни­ма­ет­ся два параметра:

  • Полу­ча­тель в фор­ма­те "79990001122/(TAG1),(TAG2),(TAG3)"
  • Заго­ло­вок триг­ге­ра, напри­мер, "Всё сло­ма­лось! (TAG2) Сроч­но про­сы­пай­тесь!"

Полу­ча­тель состо­ит из номе­ра мобиль­но­го теле­фо­на и спис­ка тегов через запя­тую, тегов может быть мно­го. Тег — это кусок тек­ста из заго­лов­ка триг­ге­ра. Я, напри­мер, встав­ляю в назва­ния триг­ге­ров теги вида (WIN) или (LINUX) или (SMS).

Заго­ло­вок — это назва­ние триггера.

Если у полу­ча­те­ля есть тег, кото­рый при­сут­ству­ет в тек­сте заго­лов­ка, то полу­ча­те­лю будет отправ­лен зво­нок на теле­фон. Если у полу­ча­те­ля нет тако­го тега или тегов, то звон­ка не будет.

Пара­мет­ры bash скрипта:

  • workdir="/tmp" — дирек­то­рия на zabbix сер­ве­ре, в кото­рой будут гене­ри­ро­вать­ся WAV и CALL файлы.
  • logfile="/usr/lib/zabbix/alertscripts/freepbxgate.log" — лог файл на zabbix сервере.
  • prefix="zabbix1" — пре­фикс в назва­ни­ях фай­лов. У меня несколь­ко zabbix сер­ве­ров, для каж­до­го будет уни­каль­ный префикс.
  • prefixname="Сообщ+ение от монит+оринга." — с это­го тек­ста начи­на­ет­ся каж­дый зво­нок. Плю­сы ука­зы­ва­ют на уда­ре­ние в слове.
  • aserver="root@freepbx.domain.local" — логин и имя сер­ве­ра asterisk для пере­да­чи фай­лов SCP.
  • adir="/tmp" — дирек­то­рия на asterisk сер­ве­ре, в кото­рую пер­во­на­чаль­но копи­ру­ют­ся фай­лы. В ней им настра­и­ва­ют­ся пра­ва и владелец.
  • asounds="/var/lib/asterisk/sounds/" — дирек­то­рия на asterisk сер­ве­ре, в кото­рую копи­ру­ют­ся WAW файлы.
  • aout="/var/spool/asterisk/outgoing/" — дирек­то­рия на asterisk сер­ве­ре, в кото­рую копи­ру­ют­ся CALL файлы.

Если за мину­ту посту­пит вто­рой зво­нок, то в текст доба­вит­ся "+Очень мн+ого сообщ+ений, ч+асть звонк+ов проп+ущена!", боль­ше в эту мину­ту звон­ков не будет, хотя логи про­дол­жат запи­сы­вать­ся. Думаю, потом я сде­лаю пери­од звон­ков побольше.

Пара­мет­ры CALL фай­ла изме­ни­те для сво­их нужд. Напри­мер, у меня в каче­стве Callerid исполь­зу­ет­ся суще­ству­ю­щий Wake Up Calls <*68>, кото­рый есть в freepbx для звон­ков будиль­ни­ка. Если сооб­ще­ние нуж­но про­иг­рать три раза, то заме­ни­те строчку:

echo "Data: $fp" >> $callfile

на

echo "Data: $fp&$fp&$fp" >> $callfile

Настройка zabbix

Administration > Media types. Добав­ля­ем новый тип FreePBX Gate.

Настра­и­ва­ем:

  • Name: FreePBX Gate
  • Type: Script

Configuration > Actions. Созда­ём Report problems to Zabbix administrators (FREEPBX).

Action — ука­зы­ва­ем нуж­ные нам условия.

Operations. Здесь мож­но настро­ить Subject, имен­но он будет читать­ся в телефоне.

Добав­ля­ем опе­ра­цию Send message to user groups: Zabbix administrators via FreePBX Gate.

Здесь нуж­но ука­зать, что уве­дом­ле­ние отправ­ля­ем через FreePBX Gate.

В Recovery operations мож­но тоже доба­вить зво­нок о том, что про­бле­ма устра­не­на, но я убрал эту возможность.

Acknowledgement operations мне тоже не нужно.

Теперь у себя в настрой­ках смот­рю раз­дел Media и добав­ляю FreePBX Gate 79990001122/(SMS AGENT),(PING),(SMS),(WEB),(VR),(HW),(1C),(WIN),(CRM) 1-7,00:00-24:00 NIWAHD, потом пере­на­строю на ночь.

Вот при­мер триг­ге­ров, на кото­рые дол­жен отре­а­ги­ро­вать скрипт:

Текст "(SMS AGENT)" есть в спис­ке моих тегов, поэто­му зво­нок пройдёт.