Однажды ночью на станции отключились кондиционеры и начала подниматься температура, естественно мне пришли email уведомления на телефон, но так как была ночь, увидел я их только утром, поэтому понадобилось для таких экстренных случаев быстро сделать возможность уведомлений звонком на телефон.
Наведу пример варианта оповещений Zabbix используя телефонный вызов через Asterisk.
У Asterisk должен быть загружен модуль, для этого откроем файл конфигурации модулей, например в редакторе nano (Ctrl+X для выхода, y/n для сохранения или отмены изменений):
sudo nano /etc/asterisk/modules.conf
И проверим есть ли cтрока, если нет — добавим:
load => pbx_spool.so
А также подгрузим его в данный момент:
sudo asterisk -rvv
module load pbx_spool
quit
В моем случае Zabbix и Asterisk находятся на разных серверах.
На сервере с Asterisk я написал русский текст уведомления в текстовый файл high_temperature.txt которое должно воспроизвестись при звонке.
Установил festival, русский мужской голос чтобы конвертировать текст в звуковой файл и rsync чтобы копировать файл звонка на сервер Asterisk:
sudo apt-get install festival festvox-ru rsync
Собственно команда конвертации текста в звуковой файл:
text2wave -eval '(voice_msu_ru_nsh_clunits)' < high_temperature.txt > high_temperature.wav
Далее конвертировал формат файла wav в ulaw, так как у меня используется он:
sox -V high_temperature.wav -r 8000 -c 1 -t ul high_temperature.ulaw
И переместил готовый звуковой файл в директорию со звуковыми файлами Asterisk:
sudo mv high_temperature.ulaw /usr/share/asterisk/sounds/ru_RU/high_temperature.ulaw
Смотрите также мою статью — Как конвертировать звуковые файлы в ulaw, alaw, gsm, g722 и т.д. для Asterisk
На сервере с Zabbix используя текстовый редактор nano я создал файл:
sudo nano /etc/zabbix/zabbix.call
И добавил в него содержимое (где 0670000000 номер телефона на который нужно звонить, а цифра 4 это номер канала Goip4 GSM шлюза с которого будет совершен звонок):
Channel: SIP/goip4/40670000000
Application: Playback
Data: high_temperature
MaxRetries: 10
RetryTime: 60
WaitTime: 30
На файл я установил права 777 чтобы разрешить доступ всем, пользователь zabbix будет его копировать, а на другом сервере пользователь asterisk прочитает и удалит после звонка:
sudo chmod 777 /etc/zabbix/zabbix.call
Также нужно создать сам файл скрипта, который будет выполнять Zabbix (я создал в директорий со скриптами zabbix/alert.d/asterisk_call.sh):
rsync -v -e "ssh -p 22" /etc/zabbix/zabbix.call root@192.168.1.5:/var/spool/asterisk/outgoing/zabbix.call
Скрипт просто копирует файл zabbix.call на сервер с Asterisk в директорию /var/spool/asterisk/outgoing/, после попадания в которую, Asterisk сразу обрабатывает его и совершает звонок.
По сути скрипту можно передавать номер звонящего и составлять файл zabbix.call, но мне это не нужно было.
Если Asterisk и Zabbix на одном сервере, то строку в скрипте заменим на:
cp /etc/zabbix/zabbix.call /var/spool/asterisk/outgoing/zabbix.call
Или:
rsync -v /etc/zabbix/zabbix.call /var/spool/asterisk/outgoing/zabbix.call
Чтобы rsync выполнял копирование без запроса пароля, нужно сгенерировать SSH ключ и скопировать его на сервер Astersik, как это делать я описывал в этой статье — Подключение к SSH с использованием ключей
Если доступ к серверу по SSH предоставляется пользователю root, то в целях безопасности можно ограничить доступ по IP средствами SSH:
sudo nano /etc/ssh/sshd_config
AllowUsers user1 user2 root@192.168.1.4
sudo service ssh restart
Если проблемы с правами на сервере с Zabbix, например при копировании call файла, можно в файле конфигурации /etc/zabbix/zabbix_server.conf указать следующий параметр:
AllowRoot=1
Осталось добавить новый тип оповещения в панели Zabbix («Администрирование» — «Способы оповещений»).
Далее создал новую группу узлов и добавил устройство для которого отрабатывает триггер о высокой температуре.
Создал отдельного пользователя, указал ему созданный тип оповещения и добавил в созданную группу узлов.
Также добавил действие в «Настройка» — «Действия» указав отправку сообщений через скрипт.
Готово, после срабатывания триггера, Zabbix выполнит скрипт который скопирует готовый call файл на сервер Asterisk, а он уже обработает его и совершит звонок, как указано в файле — «MaxRetries: 10», будет пытаться дозвонится 10 раз.