Введение
Мониторинг zabbix славится своей гибкостью. Я его люблю в основном за это. Можно придумать какой угодно функционал в скриптах и прикрепить его в виде триггера к заббиксу. То же самое можно делать с различными метриками, но сегодня мы будем говорить именно о триггерах.
Asterisk умеет совершать исходящие звонки на основе информации в так называемых call файлах. Ему достаточно положить в определенную папку файл, где будут указаны параметры звонка и он позвонит. Таким образом, наша задача по настройке оповещений в виде звонков на мобильный телефон сводится к созданию таких файлов на нужные нам события.
Мы можем позвонив, проговорить записанную ранее аудиозапись, либо прочитать текст из файла. Второй вариант более сложный, требует установку дополнительных программ, умеющих читать текст. Мне это было не нужно, так как набор фраз был ограниченный и его не сложно записать заранее. Так что у меня zabbix будет звонить через asterisk и говорить заранее подготовленные записи.
Первым делом мы напишем скрипт, который будет генерировать call файлы для asterisk и подготовим dialplan астериска для исходящих звонков через zabbix. А потом настроим выполнение этого скрипта по определенным событиям в мониторинге.
Все действия будут выполняться на серверах под управлением CentOS.
Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему CentOS:
- Установка CentOS 8.
- Настройка CentOS 8.
- Установка и настройка zabbix сервера.
То же самое на Debian 10, если предпочитаете его:
- Установка Debian 10.
- Базовая настройка Debian.
- Установка и настройка zabbix на debian.
Когда все готово, можно приступать к реализации задуманного.
Проверка работы оповещения на сотовый
Осталось проверить работу всей конструкции. Для этого заходим 3-мя пользователя по ssh на сервер asterisk и ждем звонка. При срабатывании триггера на дашборде будет следующая информация.
В это же время вам придет звонок на мобильник. Если не ответите на звонок, через 90 секунд позвонит еще раз. В логе агента заббикс появится следующая запись:
# cat /var/log/zabbix/zabbix_agentd.log 44152:20170407:175635.453 Executing command '/etc/zabbix/scripts/make-call.sh'
А в логе звонков астериск будет информация о совершенном звонке:
# cat /var/log/asterisk/cdr-csv/Master.csv "","101","s","zabbix_alarm",""""" <101>","SIP/num-mango-00007561","","BackGround","yourcallisimportant","2017-04-07 14:58:15","2017-04-07 14:58:15","2017-04-07 14:58:20",4,4,"ANSWERED","DOCUMENTATION","1491577085.45519",""
Если все сделали правильно, у вас будет примерно то же самое. Статью написал по рабочему примеру, который во время написания настроил. Реализовать подобные оповещения можно по-разному, но принцип будет тот же самый — формирование call файла и создание необходимого action. Создавать call файлы и настраивать action можно различными способами.
Помогла статья? Подписывайся на telegram канал автора
Онлайн курс «DevOps практики и инструменты»
Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров.
Проверьте себя на вступительном тесте и смотрите программу детальнее по .
Рекомендую полезные материалы по Zabbix: |
Настройки системы |
---|
Видео и подробное описание установки и настройки Zabbix 4.0, а также установка агентов на linux и windows и подключение их к мониторингу. Подробное описание обновления системы мониторинга zabbix версии 3.4 до новой версии 4.0. Пошаговая процедура обновления сервера мониторинга zabbix 2.4 до 3.0. Подробное описание каждого шага с пояснениями и рекомендациями. Подробное описание установки и настройки zabbix proxy для организации распределенной системы мониторинга. Все показано на примерах. Подробное описание установки системы мониторинга Zabbix на веб сервер на базе nginx + php-fpm. |
Мониторинг служб и сервисов |
Мониторинг температуры процессора с помощью zabbix на Windows сервере с использованием пользовательских скриптов. Настройка полноценного мониторинга web сервера nginx и php-fpm в zabbix с помощью скриптов и пользовательских параметров. Мониторинг репликации mysql с помощью Zabbix. Подробный разбор методики и тестирование работы. Описание настройки мониторинга tcp служб с помощью zabbix и его инструмента простых проверок (simple checks) Настройка мониторинга рейда mdadm с помощью zabbix. Подробное пояснение принципа работы и пошаговая инструкция. Подробное описание мониторинга регистраций транков (trunk) в asterisk с помощью сервера мониторинга zabbix. Подробная инструкция со скриншотами по настройке мониторинга по snmp дискового хранилища synology с помощью сервера мониторинга zabbix. |
Мониторинг различных значений |
Настройка мониторинга web сайта в zabbix. Параметры для наблюдения — доступность сайта, время отклика, скорость доступа к сайту. Один из способов мониторинга бэкапов с помощью zabbix через проверку даты последнего изменения файла из архивной копии с помощью vfs.file.time. Подробное описание настройки мониторинга размера бэкапов в Zabbix с помощью внешних скриптов. Пример настройки мониторинга за временем делегирования домена с помощью Zabbix и внешнего скрипта. Все скрипты и готовый шаблон представлены. Пример распознавания и мониторинга за изменением значений в обычных текстовых файлах с помощью zabbix. Описание мониторинга лог файлов в zabbix на примере анализа лога программы apcupsd. Отправка оповещений по событиям из лога. |
Настройка оповещений через asterisk
Я не буду рассказывать о формате call файлов астериск. В интернете есть полная информация. Привожу сразу готовый скрипт с комментариями, который будет генерировать файл звонка. Этот скрипт должен располагаться на сервере с asterisk. И на нем обязательно должен стоять zabbix-agent. Можно и без этого обойтись, генерировать call файл в любом месте и потом по сети тем или иным способом передавать на сервер с asterisk. Но мне удобнее все делать сразу на астериске, так как у меня всегда все сервера под мониторингом.
Создадим директорию для скрипта, выставим на нее права и напишем скрипт для формирования call файла.
# mkdir /etc/zabbix/scripts && chown zabbix. /etc/zabbix/scripts # mcedit /etc/zabbix/scripts/make-call.sh
#!/bin/bash callname=/etc/zabbix/scripts/zabbix-alert.call # Call-файл Asterisk echo "Channel: SIP/89659036455@num-mango" > $callname # Каким номером представляемся echo "Callerid: 101" >> $callname # Сколько раз звонить в случае неответа echo "MaxRetries: 2" >> $callname # Через сколько времени перезваниваем (сек) echo "RetryTime: 90" >> $callname # Сколько ждем ответа (сек) echo "WaitTime: 60" >> $callname # Контекс звонка в dialplan echo "Context: zabbix_alarm" >> $callname echo "Extension: s" >> $callname echo "Priority: 1" >> $callname cp $callname /var/spool/asterisk/outgoing/zabbix-alert.call rm -f $callname
89659036455 | Мобильный телефон, куда будем звонить |
num-mango | Имя транка для исходящих звонков |
zabbix_alarm | Имя контекста в dialplan, по которому выполняется звонок |
Мы создаем файл с нужными параметрами и копируем его в папку /var/spool/asterisk/outgoing. После этого asterisk сразу совершает звонок.
Теперь добавим указанный контекст в dialplan. Редактируем файл /etc/asterisk/extensions.conf
exten => s,1,Answer exten => s,n,Wait(1) exten => s,n,Background(yourcallisimportant) exten => s,n,hangup
В этом контексте мы снимаем трубку и говорим абоненту стандартную фразу из поставки астериска: «Ваш звонок очень важен для нас бла бла бла….» Поставил для теста ее, потому что она достаточно длинная. Удобно проверять функционал. Если у вас уже готовы ваши фразы, можете использовать сразу их.
В данном примере один скрипт и один контекст с одной фразой. Если вам нужно несколько разных фраз проговаривать на разные события, то создавайте на каждое такое событие отдельный скрипт, в нем отдельный контекст, а уже в контекстах указывайте разные фразы. Я все покажу на одном примере.
Перечитываем диалплан и можно тестировать. После запуска скрипта вручную, астериск должен вам позвонить и проговорить указанную фразу. Если этого нет, то разбирайтесь сразу на месте, дальше в zabbix лезть нет смысла. Сначала надо настроить звонок
Обратите внимание на права файлов. Не забывайте, что скрипт будет исполняться от пользователя, под которым работает мониторинг
Скорее всего это zabbix. У него должны быть права для записи в папку /var/spool/asterisk/outgoing, иначе он не сможет создать call файл. Я просто добавил права на запись в эту папку группе zabbix:
# chown root:zabbix /var/spool/asterisk/outgoing && chmod 0775 /var/spool/asterisk/outgoing
Еще раз обращаю внимание на права на папки, скрипты, файлы. Проверяйте их в первую очередь
Я несколько раз настраивал оповещения на мобильный и всегда спотыкался на этих моментах. То на директорию со скриптами забуду добавить права на запись, не создавался временный файл, то в папку с астериском не хватало прав записать файл. При этом в логах нигде никаких ошибок я не видел. Заббикс рапортовал об успешном выполнении внешнего скрипта, но при этом ничего не происходило.
Нам нужно разрешить выполнение внешних скриптов в zabbix-agent. Заодно включим их логирование. Для этого выставляем в файле конфигурации агента следующие параметры:
EnableRemoteCommands=1 LogRemoteCommands=1
Перезапускаем агента:
# systemctl restart zabbix-agent
На астериске настройку закончили. У нас все готово для совершения звонков по событиям.
Что представляет собою asterisk и как это функционирует?
Asterisk – это программа, представляющая собою альтернативную телефонную станцию с открытым исходным кодом. Она обладает всеми возможностями традиционной АТС и рядом дополнительных функций для управления звонками. Чтобы организовать телефонную связь при помощи Asterisk не нужно развертывать телефонные линии и подключать много дополнительного оборудования – достаточно загрузить программное обеспечение с официального сайта разработчика на свой сервер и произвести нужные настройки.
Данное программное обеспечение совместимо с операционными системами Linux, OpenBSD, Solaris, FreeBSD и некоторыми другими ОС.
Функциональные возможности телефонной станции на базе Asterisk
Эта программа используется компаниями для настройки внутренней и внешней телефонии в офисе. К IP Asterisk АТС можно подключить виртуальные номера (городские или мобильные) с необходимым числом линий, а также номер 800 Toll Free желаемого региона. Поступление звонков будет осуществляться на удобное направление без использования дополнительного оборудования.
VoIP телефония позволяет задать переадресацию на:
- Ваш IP адрес;
- Аналоговый мобильный или городской номер;
- SIP (в том числе и IP телефон).
Переадресация звонков
Freezvon рекомендует установить бесплатную переадресацию на IP адрес, SIP аккаунт (мы предоставляем его бесплатно при покупке номера).
Настройки Asterisk позволяют подключить ряд дополнительных функций для управления звонками:
- Перевод звонков (условный и безусловный) – возможность переключения звонков с одного абонента на другого;
- Удержание звонков – возможность отправить активный звонок на удержание, чтобы набрать другой номер, а затем возобновить его обратно;
- Уведомление о поступлении нового вызова – если линия занята и поступает новый звонок, вызываемый абонент получает уведомление об этом звонке;
- Переадресация вызовов – Вы можете перенаправлять звонки на определенные направления;
- Запись информации о звонках – сохранения информации и поступающих и совершаемых звонках (их статусе, продолжительности, времени совершения и т.д.) в отдельном текстовом файле;
- Голосовая почта – возможность создать автоответчик, чтобы абоненты могли оставлять краткие сообщения, если не смогли к Вам дозвониться;
- Конференц-связь – поддержание разговора с несколькими абонентами одновременно;
- IVR меню – настройка голосового меню, руководствуясь которым абоненты могут соединиться с нужным департаментом или сотрудником компании;
- Запись разговоров – Вы можете записывать все телефонные разговоры компании.
Преимущества использования Asterisk для организации связи
Виртуальная АТС на базе Asterisk опережает традиционные телефонные станции по множеству параметров. Ее главные преимущества заключаются в следующем:
- Вы можете скачать данное программное обеспечение бесплатно с Веб-сайта разработчика;
- Чтобы установить Asterisk, не нужно многочисленное оборудование – достаточно наличия сервера;
- Широкие возможности работы со звонками, включающие их переадресацию, распределение между абонентами, удержание и много других функций;
- Возможность подключить в Астериск многоканальные виртуальные номера избавляет от необходимости развертывать телефонные линии;
- У Вас есть возможность настроить корпоративный биллинг благодаря системе статистики Asterisk;
- Можно обеспечить бесплатную связь между сотрудниками, создав требуемое число внутренних номеров.
- SIP аккаунты для дешевых звонков заграницу.
Asterisk интегрируется с другим программным обеспечением, например с CRM или С1, позволяя эффективно организовать работу компании.
Как подключить виртуальные номера к Asterisk?
Чтобы настроить телефонную станцию для Вашей компании, необходимо загрузить программное обеспечение с официального сайта разработчика и произвести установку Asterisk (Вы можете сделать это самостоятельно или обратиться к услугам системного администратора). Затем следует приобрести виртуальный номер.
numbers_pool
id | number | provider_id | server_id | enabled | direction | virtualflag | echotest |
---|---|---|---|---|---|---|---|
125 | 37167859001 | 4 | 1 | 1 | IN | 1 | |
126 | 37167859002 | 4 | 1 | 1 | IN | 1 | |
278 | 4971122954000 | 4 | 1 | IN | 1 | ||
279 | 74951815000 | 7 | 1 | 1 | IN/OUT | ||
280 | 74951815001 | 7 | 1 | 1 | IN/OUT | ||
281 | 74951815002 | 7 | 1 | 1 | IN/OUT | ||
426 | 74951339501 | 3 | 2 | IN/OUT | 1 | ||
427 | 74951339502 | 3 | 1 | IN/OUT | 1 | ||
515 | 74957952301 | 16 | 1 | 1 | IN/OUT | ||
516 | 74957952302 | 16 | 2 | 1 | IN/OUT | ||
529 | 442038070121 | 11 | 1 | 1 | IN | 1 | |
531 | 442038070123 | 11 | 1 | 1 | IN | 1 |
Описание полей:
- number — номер в международном формате
- provider_id — привязка номера к оператору
- server_id — привязка номера к серверу
- enabled — обслуживать вызовы на данном номере или нет
- direction — обслуживаемые номером направления вызова
- virtualflag — номер является «реальным» или «виртуальным». «Реальные» номера привязаны к диалпирам, «виртуальные» не имеют привязки
- echotest — включение режима тестирования номера. если режим включен, то вызов переадресовывается на приложение Echo() сервера Asterisk
На момент разработки системы количество арендованных номеров было около 400 штук, количество серверов 4. Для тестирования маршрутизации вызовов даже добавляли Мультифон от Мегафона. При использовании «реальных» номеров, привязанных к логину/паролю, необходимо обеспечить осуществление вызова через правильный диалпир. Так как asterisk не может знать через какой диалпир должен маршрутизироваться вызов, необходимо создать таблицу связей.
providers
id | providername | currency_id | noncli_prefix | cli_prefix | premcli_prefix | cli_allowed | dynamic_calls | append_plus | dynamic_calls_caller_id |
---|---|---|---|---|---|---|---|---|---|
3 | Zadarma | 96 | N | N | 1 | ||||
4 | Multitel | 122 | N | N | 1 | ||||
7 | WestCall | 96 | Y | N | 74951815283 | ||||
8 | VoxBeam | 122 | 0011103 | 0011101 | 0011102 | Y | Y | 1 | |
11 | VoiceBuy | 122 | 9991 | 9992 | 9993 | Y | Y | 1 | |
16 | IPPort | 96 | N | N | 1 |
Итак. Операторы.
Обычно у зарубежных операторов 2-3 тарифа по которым они доставляют трафик до вызываемого абонента. Про различия CLI и NonCLI техник можно прочитать здесь.
Для выбора тарифного плана обычно используется префикс (noncli_prefix, cli_prefix, premcli_prefix) указываемый перед вызываемым номером в процессе формирования строки вызова.
Описание полей:
- providername — наименование оператора
- currency_id — валюта оператора
- noncli_prefix — тариф без поддержки CLI
- cli_prefix — тариф с поддержкой CLI
- premcli_prefix — тариф премиального уровня
- cli_allowed — указывает на то, что оператор позволяет менять CLI для исходящих вызовов
- dynamic_calls — указывает, что оператор позволяет осуществлять звонки по любым направлениям с любым CLI.
- append_plus — добавлять или не добавлять «+» перед вызываемым номером. Часть операторов требует «+», часть нет.
- dynamic_calls_caller_id — CID для оператора по умолчанию.
В случае с WestCall и другими операторами предоставляющими подключение через SIP транк, вы покупаете пул номеров и осуществляя вызовы можете менять исходящий номер на любой номер из данного пула. IPPort как и прочие операторы, при использовании схемы логин/пароль с единственным купленным номером, не позволяют менять исходящий номер. Операторы VoxBeam и VoiceBuy используются для исходящих звонков для любых направлений и позволяют менять исходящий номер на любой другой. Правда здесь есть одно но! И заключается оно в том, что конечные операторы связи доставляющие звонок до вызываемого абонента, могут отклонить вызов или поменять номер вызывающего абонента на свой, если вызывающий номер соответствует внутреннему номеру страны или местности. Т.е. скажем при звонке из России в Украину(Киев) мы меняем CallerID на украинский номер в Киеве и оператор связи через которого идёт вызов может данный звонок просто «отбить», т.к. он не соответствует внутренней политике обработки звонков «Звонок через внешний входящий международный транк не может содержать внутренних номеров». Операторы Zadarma и Multitel у нас будут использоваться в качестве поставщиков номеров и исходящий трафик мы через них отправлять не будем, хотя при желании могли бы.
Важным аспектом обработки вызова является безопасность. Довольно часто встречаются ситуации, когда неверно настроенный сервер IP телефонии позволяет пропускать сквозь себя чужие звонки. Для обеспечения безопасности контуров обрабатывающих входящие и исходящие звонки, дополнительно к разделению операторов по различным контекстам, стоит создать базу IP адресов операторов связи предоставляющих нам услуги связи. Во первых это позволит настроить экспорт адресов в firewall и убрать лишние попытки «прозвона» через нас, во вторых даст более полную информацию о способах подключения к операторам связи.
servers
id | servername | location | ipaddress | comment | sip | iax2 | iax2control | protocol |
---|---|---|---|---|---|---|---|---|
undefined | 2130706433 | SIP | ||||||
1 | asterisk-macomnet | 189 | 3557129729 | SIP/212.5.126.1 | IAX2/macomnet@macomnet | IAX2/macomnetcontrol@macomnet | IAX2 | |
2 | asterisk-msm | 189 | 1506807809 | SIP/89.208.16.1 | IAX2/msm@msm | IAX2/msmcontrol@msm | IAX2 | |
5 | asterisk-corbina | 189 | 1399234817 | SIP/83.102.161.1 | IAX2/corbina@corbina | IAX2/corbinacontrol@corbina | IAX2 |
Описание полей:
- servername — внутреннее имя сервера
- location — географическая зона в которой находится сервер. В данном случае Россия
- ipaddress — реальный IP адрес сервера
- sip — SIP URL для соединения с сервером
- iax2 — Связка RSA ключа с идентификатором сервера для переадресации звонков между серверами
- iax2control — специальный канал команд для удалённого управления серверами и межсерверного взаимодействия. Длина команды до 80 символов
- protocol — информационное поле для сортировки по типу межсерверной связи
Для чего нужна эта таблица и почему она такая странная? Для межсерверного соединения серверов asterisk удобнее всего использовать протокол IAX. Причин несколько:
- весь транзитный трафик между серверами можно зашифровать
- в отличие от SIP протокола — более простое прохождение через Firewall операторов связи(для работы нужен всего 1 UDP порт)
- невозможность установки соединения злоумышленником с сервером без наличия ключей шифрования
- возможность передавать данные между серверами. например сессионные переменные. В SIP протоколе можно добавлять данные в заголовки сессионных пакетов, но зачастую лишние заголовки просто «вычищаются» промежуточными серверами из пакетов. В IAX протоколе можно перед установкой соединения передать необходимые переменные в потоке
- чёткая привязка хоста и связки пользователей/ключей к контексту на сервере
С серверами на начальном этапе разобрались. Теперь необходимо сделать привязку арендуемых номеров к определенному серверу. Это необходимо для корректной маршрутизации вызовов.
vw_providers
id | providername | proto | aa | direction |
---|---|---|---|---|
16 | IPPort | SIP | 89.208.190.5 | IN |
16 | IPPort | SIP | sip.n1.ipport.net | OUT |
16 | IPPort | SIP | 89.208.190.8 | IN |
4 | Multitel | SIP | 80.97.55.105 | IN |
4 | Multitel | SIP | 209.124.34.104 | OUT |
4 | Multitel | SIP | 41.218.96.199 | IN |
11 | VoiceBuy | SIP | sip.voicebuy.com | OUT |
8 | VoxBeam | SIP | sbc.voxbeam.com | OUT |
8 | VoxBeam | SIP | 95.211.119.240 | IN |
7 | WestCall | SIP | 195.94.225.2 | IN/OUT |
3 | Zadarma | SIP | proxy-1.fr.zadarma.com | IN |
3 | Zadarma | SIP | proxy-3.ri.zadarma.com | IN |
3 | Zadarma | SIP | siplv.zadarma.com | IN |
3 | Zadarma | SIP | proxy-8.fr.zadarma.com | IN |
3 | Zadarma | SIP | sip.zadarma.com | OUT |
3 | Zadarma | SIP | siplv1.zadarma.com | IN |
3 | Zadarma | SIP | mediarelay-1.zadarma.com | IN |
Для чего это нужно ?
- Входящий вызов на номер телефона, арендованного нами у конкретного оператора, должен приходить из пула IP адресов серверов этого оператора. Поэтому в момент входящего вызова стоит проверить номер привязанный к оператору с таблицей IP адресов оператора
- Оператор может иметь несколько серверов обрабатывающих исходящие вызовы от нашего сервера, поэтому это нужно учесть при формировании очереди дозвона
- Данная схема позволяет мгновенно получать строку вызова. При этом замена domainname на имя транка определенного в sip.conf или iax.conf не нарушает работу системы
- Номера могут быть «размазаны» по нескольким серверам для отказоустойчивости, а могут быть жёстко закреплены за каждым сервером. Нет смысла обслуживать вызов на сервере, к которому этот номер не прикреплён.
Попробуем получить строку вызова для номера 74957777777.
Звонок на мобильный телефон по событию в zabbix
Настраиваем сам сервер мониторинга zabbix. Я для примера буду использовать следующее событие — будем звонить на мобильный телефон, когда количество ssh пользователей на сервере будет больше, чем 2. Эта метрика есть в стандартном шаблоне для серверов linux. Триггер создам для этого вручную. Открываем необходимый для теста хост и добавляем новый триггер.
В данном случае asterisk это имя сервера. Сервер может быть любым.
Прежде, чем двигаться дальше, убедитесь, что триггер корректно срабатывает. Я всегда рекомендую все действия выполнять по шагам и проверять работу на каждом шаге. Это существенно облегчает отладку ошибок, а без них редко получается сразу все настроить.
Дальше идем в раздел Configuration -> Actions и создаем новое действие с Event source в виде Triggers. Выбираем в качестве условия только что добавленный триггер.
Переходим на вкладку Operations и добавляем там новое действие в соответствии с нашей задачей.
Обращаю внимание, что вы можете привязаться к триггеру на любом сервере, а действие по оповещению в виде скрипта будет выполнено на сервере с астериском. Сохраняйте все данные и можно проверять
Я заметил небольшую ошибку. Когда вы повторно зайдете в только что созданный action, строка с условием, где вы указывали имя триггера, будет пустой. Сначала я подумал, что значение не сохраняется, и работать ничего не будет. Но на практике оказалось, что все нормально сохраняется и работает, но данные почему то не отображаются при повторном заходе.