Zabbix – умный, гибкий, кастомизируемый – умеет все. Или почти все. Было бы странно, если бы он не мог подружиться с облачной телефонией, особенно когда у последней есть удобное HTTP API – пользуйся на здоровье. Сегодня мы наглядно покажем, как настроить Zabbix для звонков-уведомлений через Voximplant, что может быть очень кстати в экстренном случае («нет времени объяснять, нужно звонить – боевой сервер упал только что»).
За основу взят кадр из х/ф «Матрица» (The Matrix (1999), Warner Bros.)
В нашем примере используется VDS с CentOS 7, на которой установлен Zabbix 4.2.6 (последняя стабильная версия на момент написания статьи). Мониторить будем тот же сервер, где и работает Zabbix. Со стороны Voximplant нужен аккаунт на платформе и сценарий обработки звонка на JS. А теперь немного подробнее.
Никакого rocket science, сделаем очень простой мониторинг, который реагирует на появление файла /tmp/habrTriggerFile: когда такой файл появится, Zabbix обратится к Voximplant по HTTP API, сработает сценарий, который позвонит на указанный номер телефона, скажет «Внимание. На сервере был создан файл.» и положит трубку. Если удалить/переименовать файл, а потом вернуть его обратно, то снова будет звонок. Если ничего не делать, то будет только один звонок.
Зайдите в свой аккаунт (или зарегистрируйтесь) и создайте приложение habr. Внутри приложения зайдите на вкладку Scenarios и создайте сценарий notification с таким кодом:
Этот сценарий можно запустить HTTP-запросом (и обойтись без покупки номера телефона). Не забудьте подставить в callPSTN номера телефонов: первый – кому будет звонить платформа, второй – это callerid, который высветится у вызываемого абонента; это может быть либо ваш личный номер, который прошел верификацию на платформе, или ранее купленный у Voximplant номер (внимание, виртуальные номера нельзя использовать). Сценарий звонит на номер, после соединения сообщает, что был создан файл и кладет трубку.
Сохраните сценарий и перейдите на вкладку Routing, чтобы создать правило:
![](https://habrastorage.org/r/w780q1/webt/oq/_t/pm/oq_tpm3ax6p79y5pwfzii3utpae.jpeg)
Сохраните правило и – внимание – скопируйте его ID.
![](https://habrastorage.org/r/w780q1/webt/vu/kz/yc/vukzyclxf6vzalebrz1dbsvni2e.jpeg)
Далее вам понадобятся API keys, возьмите их в соответствующем разделе главного меню.
Зная API keys и ID правила, вы можете подставить их в метод StartScenarios нашего HTTP API, получится примерно так:
Чуть позже мы используем этот запрос при настройке мониторинга, которую уже можно начинать.
Зайдите под своим пользователем (или под админом) в Zabbix frontend, далее в раздел Configuration – Hosts, нажмите Create host. В имени пропишите localhost, в groups укажите test group и нажмите внизу Add.
![](https://habrastorage.org/r/w780q1/webt/as/ep/9o/asep9oqe5p0fjsmfrspqp7mytwk.jpeg)
Теперь в списке хостов вы увидите как созданный по умолчанию Zabbix server, так и localhost. Отсюда же мы продолжим настройку.
Мониторинг Zabbix базируется на цепочке из 3 сущностей: Item – Trigger – Action. Все три звена – обязательные, поэтому необходимо последовательно создать каждое из них.
Item – это аккумулятор данных, а без данных мониторингу не на что будет реагировать. Чтобы создать Item, в списке хостов нажмите Items правее имени localhost. Также можно нажать на само имя хоста и на открывшемся экране перейти на вкладку Items – суть та же. Попав на вкладку Items, нажмите Create item в правом верхнем углу. Введите название – habr item, далее нажмите Add рядом с полем Key – листайте вниз, нам нужен стандартный ключ vfs.file.exists, выберите его и он подставится в поле Key. Замените file на актуальный путь, в нашем случае ключ получится таким: vfs.file.exists[/tmp/habrTriggerFile]. В поле Update interval поставьте 5s, чтобы мониторинг быстрее среагировал, когда мы создадим файл на хосте. Внизу страницы нажмите Add, и сразу же увидите новый item.
![](https://habrastorage.org/r/w780q1/webt/4e/fy/n0/4efyn0yodwpvunisxnx7siatcg4.jpeg)
Триггеры оценивают собранные данные и при достижении указанного порога реагируют – запускают действие. Находясь на экране с созданным item, перейдите на вкладку Triggers:
![](https://habrastorage.org/r/w780q1/webt/ko/ay/xx/koayxxidq2cdwo_ht1n5kkfoygk.jpeg)
Нажмите Create trigger, назовите его habr trigger. Значение для поля Expression удобно собрать с помощью конструктора – кнопка Add. Выставьте настройки как на скриншоте и кликните Insert:
![](https://habrastorage.org/r/w780q1/webt/zj/th/lo/zjthlop_e4pffeowtleynperswy.jpeg)
Нажмите Add внизу страницы – готово, триггер создан.
Action – это действие, которое запускает сработавший триггер. Откройте вкладку Configuration – Actions, нажмите Create action. Название – внезапно – habr action. Ниже, в блоке New condition, оставьте все по умолчанию и допишите habr, в итоге получится условие Trigger name contains habr. Нажмите Add, чтобы добавить условие – оно тут же появится в блоке Conditions, см. скриншот:
![](https://habrastorage.org/r/w780q1/webt/js/45/fn/js45fnk8aj1ymauczt99xtixx9a.jpeg)
Здесь же перейдите на вкладку Operations, затем в блоке Operations нажмите New, чтобы добавить действие. В Operation type выберите Remote command, появятся блок Target list и поле ввода Commands. В блоке Target list нажмите New, вам предложат цель по умолчанию – Current host, он-то вам и нужен – нажмите Add и цель появится в списке. В поле ввода вставьте curl + ранее сформированный запрос к Voximplant:
Затем добавьте это действие (Add в виде ссылки), и только потом кликайте кнопку Add, чтобы завершить создание Action.
![](https://habrastorage.org/r/w780q1/webt/ne/sr/nf/nesrnfgyv2rikp40vnthmm0kmmk.jpeg)
Важный момент: мы выбрали тип действия Remote command, который по умолчанию выключен в конфиге агента Zabbix. Чтобы исправить это, на хосте откройте конфиг и проставьте значение 1 для EnableRemoteCommands:
После этого перезапустите сервис агента:
В панели Zabbix перейдите в раздел Monitoring – Problems. Скоро мы увидим здесь предупреждение, что сработал триггер.
На хосте создайте файл:
Через 5 секунд в панели Problems мы увидим новое сообщение; в столбце Status будет мигать PROBLEM, a если нажать на пиктограмму в столбце Actions, то будут видны подробности действия (скриншот кликабелен):
![](https://habrastorage.org/r/w780q1/webt/vl/kw/az/vlkwazib1r2snoujsrm3g617s1c.jpeg)
Попутно произойдет звонок на номер телефона, который мы указали в сценарии Voximplant.
За основу взят кадр из х/ф «Матрица» (The Matrix (1999), Warner Bros.)
Если переименовать файл,
то через 5 секунд статус проблемы станет RESOLVED.
Готово! Вы великолепны, потому что настроили цепочку взаимодействия хост–Zabbix–Voximplant и по тому же принципу можете настроить сколь угодно сложную логику для звонков-уведомлений.
![](https://habrastorage.org/webt/tu/k5/_o/tuk5_odcpfkuzsgmqs5wgugzdw0.png)
Внимание: туториал подразумевает, что у вас уже есть работающий Zabbix и настроен Zabbix frontend. Первичная установка Zabbix не является целью этой статьи, любопытные/нуждающиеся в таком руководстве могут посмотреть официальную документацию и/или погуглить.
С чем будем работать
В нашем примере используется VDS с CentOS 7, на которой установлен Zabbix 4.2.6 (последняя стабильная версия на момент написания статьи). Мониторить будем тот же сервер, где и работает Zabbix. Со стороны Voximplant нужен аккаунт на платформе и сценарий обработки звонка на JS. А теперь немного подробнее.
Что будем делать
Никакого rocket science, сделаем очень простой мониторинг, который реагирует на появление файла /tmp/habrTriggerFile: когда такой файл появится, Zabbix обратится к Voximplant по HTTP API, сработает сценарий, который позвонит на указанный номер телефона, скажет «Внимание. На сервере был создан файл.» и положит трубку. Если удалить/переименовать файл, а потом вернуть его обратно, то снова будет звонок. Если ничего не делать, то будет только один звонок.
Voximplant
Зайдите в свой аккаунт (или зарегистрируйтесь) и создайте приложение habr. Внутри приложения зайдите на вкладку Scenarios и создайте сценарий notification с таким кодом:
VoxEngine.addEventListener(AppEvents.Started, () => {
const call = VoxEngine.callPSTN("куда звоним", "ваш верифицированный номер телефона")
call.addEventListener(CallEvents.PlaybackFinished, () => {
VoxEngine.terminate()
})
call.addEventListener(CallEvents.Connected, () => {
setTimeout(
() => call.say("Внимание. На сервере был создан файл.", Language.RU_RUSSIAN_FEMALE),
1000
)
})
})
Этот сценарий можно запустить HTTP-запросом (и обойтись без покупки номера телефона). Не забудьте подставить в callPSTN номера телефонов: первый – кому будет звонить платформа, второй – это callerid, который высветится у вызываемого абонента; это может быть либо ваш личный номер, который прошел верификацию на платформе, или ранее купленный у Voximplant номер (внимание, виртуальные номера нельзя использовать). Сценарий звонит на номер, после соединения сообщает, что был создан файл и кладет трубку.
Сохраните сценарий и перейдите на вкладку Routing, чтобы создать правило:
![](https://habrastorage.org/webt/oq/_t/pm/oq_tpm3ax6p79y5pwfzii3utpae.jpeg)
Сохраните правило и – внимание – скопируйте его ID.
![](https://habrastorage.org/webt/vu/kz/yc/vukzyclxf6vzalebrz1dbsvni2e.jpeg)
Далее вам понадобятся API keys, возьмите их в соответствующем разделе главного меню.
Зная API keys и ID правила, вы можете подставить их в метод StartScenarios нашего HTTP API, получится примерно так:
https://api.voximplant.com/platform_api/StartScenarios/?account_id=1&api_key=4ed5695e-4690-448r-95e8-3f8f0001287c&rule_id=28
Чуть позже мы используем этот запрос при настройке мониторинга, которую уже можно начинать.
Zabbix
Зайдите под своим пользователем (или под админом) в Zabbix frontend, далее в раздел Configuration – Hosts, нажмите Create host. В имени пропишите localhost, в groups укажите test group и нажмите внизу Add.
![](https://habrastorage.org/webt/as/ep/9o/asep9oqe5p0fjsmfrspqp7mytwk.jpeg)
Теперь в списке хостов вы увидите как созданный по умолчанию Zabbix server, так и localhost. Отсюда же мы продолжим настройку.
Мониторинг Zabbix базируется на цепочке из 3 сущностей: Item – Trigger – Action. Все три звена – обязательные, поэтому необходимо последовательно создать каждое из них.
Item
Item – это аккумулятор данных, а без данных мониторингу не на что будет реагировать. Чтобы создать Item, в списке хостов нажмите Items правее имени localhost. Также можно нажать на само имя хоста и на открывшемся экране перейти на вкладку Items – суть та же. Попав на вкладку Items, нажмите Create item в правом верхнем углу. Введите название – habr item, далее нажмите Add рядом с полем Key – листайте вниз, нам нужен стандартный ключ vfs.file.exists, выберите его и он подставится в поле Key. Замените file на актуальный путь, в нашем случае ключ получится таким: vfs.file.exists[/tmp/habrTriggerFile]. В поле Update interval поставьте 5s, чтобы мониторинг быстрее среагировал, когда мы создадим файл на хосте. Внизу страницы нажмите Add, и сразу же увидите новый item.
![](https://habrastorage.org/webt/4e/fy/n0/4efyn0yodwpvunisxnx7siatcg4.jpeg)
Trigger
Триггеры оценивают собранные данные и при достижении указанного порога реагируют – запускают действие. Находясь на экране с созданным item, перейдите на вкладку Triggers:
![](https://habrastorage.org/webt/ko/ay/xx/koayxxidq2cdwo_ht1n5kkfoygk.jpeg)
Нажмите Create trigger, назовите его habr trigger. Значение для поля Expression удобно собрать с помощью конструктора – кнопка Add. Выставьте настройки как на скриншоте и кликните Insert:
![](https://habrastorage.org/webt/zj/th/lo/zjthlop_e4pffeowtleynperswy.jpeg)
Нажмите Add внизу страницы – готово, триггер создан.
Action
Action – это действие, которое запускает сработавший триггер. Откройте вкладку Configuration – Actions, нажмите Create action. Название – внезапно – habr action. Ниже, в блоке New condition, оставьте все по умолчанию и допишите habr, в итоге получится условие Trigger name contains habr. Нажмите Add, чтобы добавить условие – оно тут же появится в блоке Conditions, см. скриншот:
![](https://habrastorage.org/webt/js/45/fn/js45fnk8aj1ymauczt99xtixx9a.jpeg)
Здесь же перейдите на вкладку Operations, затем в блоке Operations нажмите New, чтобы добавить действие. В Operation type выберите Remote command, появятся блок Target list и поле ввода Commands. В блоке Target list нажмите New, вам предложат цель по умолчанию – Current host, он-то вам и нужен – нажмите Add и цель появится в списке. В поле ввода вставьте curl + ранее сформированный запрос к Voximplant:
curl "https://api.voximplant.com/platform_api/StartScenarios/?account_id=1&api_key=4ed5695e-4690-448r-95e8-3f8f0001287c&rule_id=28"
Затем добавьте это действие (Add в виде ссылки), и только потом кликайте кнопку Add, чтобы завершить создание Action.
![](https://habrastorage.org/webt/ne/sr/nf/nesrnfgyv2rikp40vnthmm0kmmk.jpeg)
Важный момент: мы выбрали тип действия Remote command, который по умолчанию выключен в конфиге агента Zabbix. Чтобы исправить это, на хосте откройте конфиг и проставьте значение 1 для EnableRemoteCommands:
vi /etc/zabbix/zabbix_agentd.conf
// EnableRemoteCommands = 1
После этого перезапустите сервис агента:
service zabbix-agent restart
Запускаем цепочку действий
В панели Zabbix перейдите в раздел Monitoring – Problems. Скоро мы увидим здесь предупреждение, что сработал триггер.
На хосте создайте файл:
touch /tmp/habrTriggerFile
Через 5 секунд в панели Problems мы увидим новое сообщение; в столбце Status будет мигать PROBLEM, a если нажать на пиктограмму в столбце Actions, то будут видны подробности действия (скриншот кликабелен):
![](https://habrastorage.org/webt/vl/kw/az/vlkwazib1r2snoujsrm3g617s1c.jpeg)
Попутно произойдет звонок на номер телефона, который мы указали в сценарии Voximplant.
![](https://habrastorage.org/webt/qk/jm/vu/qkjmvu7ki9qixm1fix1wq5lgsn4.png)
Если переименовать файл,
mv /tmp/habrTriggerFile /tmp/habrTriggerFile_
то через 5 секунд статус проблемы станет RESOLVED.
Готово! Вы великолепны, потому что настроили цепочку взаимодействия хост–Zabbix–Voximplant и по тому же принципу можете настроить сколь угодно сложную логику для звонков-уведомлений.