Остался наверное последний шаг — и это эта заметка прежде чем я покажу, каким образом я настраиваю получение уведомления звонком при событиях с узлами. Т.е. реализуется вот такая вот схема:

Значение — Триггер на значение — Уведомление как на внутренний/внешний номер.

Такую задачу я хочу к уже существующим средствам:

Но все будет. Сегодня же настройка, как связать SIP-клиент linphonec + Zabbix Server 4.4.

Что потребуется:

Итого:

srv-zabbix (172.33.33.117)

srv-asterisk (172.33.33.2)

Начну свою пошаговую инструкцию:

Шаг №1: На сервер с ролью Zabbix 4.4 устанавливаю утилиту expect и беру из заметки скрипт №2:

ekzorchik@srv-asterisk:~$ sudo rm /tmp/a.log

ekzorchik@srv-zabbix:~$ sudo apt-get install expect -y

ekzorchik@srv-zabbix:~$ sudo nano /usr/lib/zabbix/externalscripts/call

#!/bin/bash

kill -9 `pidof linphonec`

export PATH=$PATH:`pwd`

/usr/bin/expect - <<EOD

set timeout 10

spawn linphonec

sleep 2

expect "linphonec>*"

sleep 2

send "register sip:2005@172.33.33.2 172.33.33.2 pbx2005\r"

expect "linphonec>*"

send "call 2006\r"

sleep 2

send "quit\n"

sleep 4

EOD

Шаг №2: Изменяем атрибуты для скрипта с именем call:

ekzorchik@srv-zabbix:~$ sudo chmod +x /usr/lib/zabbix/externalscripts/call

Шаг №3: Проверяю, что от имени учетной записи zabbix данный скрипт с именем call отработает, т.е. зарегистрируется sip аккаунт, инициализируется вызов номера, а номер в свою очередь запустит действие:

ekzorchik@srv-zabbix:~$ sudo su zabbix /usr/lib/zabbix/externalscripts/call

This account is currently not available.

ekzorchik@srv-zabbix:~$ sudo nano /etc/passwd

было:

zabbix:x:108:116::/var/lib/zabbix/:/usr/sbin/nologin

стало:

zabbix:x:108:116::/var/lib/zabbix/:/bin/bash

ekzorchik@srv-zabbix:~$ sudo chown -R zabbix:zabbix /var/lib/zabbix/

ekzorchik@srv-zabbix:~$ sudo su zabbix /usr/lib/zabbix/externalscripts/call

ekzorchik@srv-asterisk:~$ sudo asterisk -rvvvv

Connected to Asterisk 16.6.2 currently running on srv-asterisk (pid = 809)

Running as user 'asterisk'

Running under group 'asterisk'

Connected to Asterisk 16.6.2 currently running on srv-asterisk (pid = 809)

-- Registered SIP '2005' at 172.33.33.117:5060

[Dec 3 10:42:19] NOTICE[869]: chan_sip.c:24889 handle_response_peerpoke: Peer '2005' is now Reachable. (9ms / 2000ms)

== Using SIP RTP CoS mark 5

> 0x7fa9500370f0 -- Strict RTP learning after remote address set to: 172.33.33.117:7078

-- Executing [2006@phones:1] Wait("SIP/2005-00000008", "1") in new stack

-- Unregistered SIP '2005'

-- Registered SIP '2005' at 172.33.33.117:5060

-- Executing [2006@phones:2] NoOp("SIP/2005-00000008", "{DATETIME}}") in new stack (тут я понял, что нужно в extensions.conf перед переменной с фигурными скобками также поставить символ доллара.)

-- Executing [2006@phones:3] System("SIP/2005-00000008", "echo "1" > /tmp/a.log") in new stack

-- Executing [2006@phones:4] Hangup("SIP/2005-00000008", "") in new stack

== Spawn extension (phones, 2006, 4) exited non-zero on 'SIP/2005-00000008'

-- Unregistered SIP '2005'

srv-asterisk*CLI>

srv-asterisk*CLI> !bash

root@srv-asterisk:~# ls -l /tmp/ | grep a.log

-rw-r--r-- 1 asterisk asterisk 2 Dec 3 10:42 a.log

root@srv-asterisk:~#

root@srv-asterisk:~# exit

exit

srv-asterisk*CLI> quit

Asterisk cleanly ending (0).

Executing last minute cleanups

ekzorchik@srv-asterisk:~$

Скрипт успешно отработал.

Шаг №4: Но не правильно разрешать доступ к консоли учетной записи zabbix, а потому сделаем через Zabbix agent:

ekzorchik@srv-zabbix:~$ sudo nano /etc/passwd

было:

zabbix:x:108:116::/var/lib/zabbix/:/bin/bash

стало:

zabbix:x:108:116::/var/lib/zabbix/:/usr/sbin/nologin

ekzorchik@srv-zabbix:~$ sudo nano /etc/zabbix/zabbix_agentd.d/asterisk.conf

UserParameter=call[*],/usr/lib/zabbix/externalscripts/call

ekzorchik@srv-zabbix:~$ sudo systemctl restart zabbix-agent.service

ekzorchik@srv-zabbix:~$ sudo zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -t call

call zabbix_agentd [18202]: Warning: Failed to execute command "/usr/lib/zabbix/externalscripts/call": Timeout while executing a shell script.

[m|ZBX_NOTSUPPORTED] [Timeout while executing a shell script.]

ekzorchik@srv-zabbix:~$ sudo nano /etc/zabbix/zabbix_agentd.conf

#max 30

Timeout=5

не помогло.

Проанализировал скрипт выполняется более 10 секунд:

ekzorchik@srv-zabbix:~$ time /usr/lib/zabbix/externalscripts/call

real 0m10.021s

user 0m0.002s

sys 0m0.010s

ekzorchik@srv-zabbix:~$

ekzorchik@srv-zabbix:~$ sudo nano /etc/zabbix/zabbix_agentd.conf

Timeout=15

ekzorchik@srv-zabbix:~$ sudo systemctl restart zabbix-agent.service

На заметку: Кстати анализ времени выполнения скрипта это очень важный нюанс и я поначалу застопорился почему скрипт не отрабатывал из под учетной записи zabbix, а потом вдумчивое чтение логов, документации натолкнуло мне правильное решение. Впредь буду тестировать свои скрипты на максимальное быстродействие.

ekzorchik@srv-zabbix:~$ sudo zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -t call

и скрипт успешно отработал

ekzorchik@srv-asterisk:~$ sudo asterisk -rvvvv

Asterisk 16.6.2, Copyright (C) 1999 - 2018, Digium, Inc. and others.

Running as user 'asterisk'

Running under group 'asterisk'

Connected to Asterisk 16.6.2 currently running on srv-asterisk (pid = 809)

-- Registered SIP '2005' at 172.33.33.117:5060

== Using SIP RTP CoS mark 5

> 0x7fa9500370f0 -- Strict RTP learning after remote address set to: 172.33.33.117:7078

-- Executing [2006@phones:1] Wait("SIP/2005-00000012", "1") in new stack

-- Unregistered SIP '2005'

-- Registered SIP '2005' at 172.33.33.117:5060

-- Executing [2006@phones:2] NoOp("SIP/2005-00000012", "{DATETIME}}") in new stack

-- Executing [2006@phones:3] System("SIP/2005-00000012", "echo "1" > /tmp/a.log") in new stack

-- Executing [2006@phones:4] Hangup("SIP/2005-00000012", "") in new stack

== Spawn extension (phones, 2006, 4) exited non-zero on 'SIP/2005-00000012'

-- Unregistered SIP '2005'

srv-asterisk*CLI>

Шаг №5: Задача: Хочу чтобы когда срабатывает триггер запускалось определенное действие:

Шаг №6: Создаю глобальный скрипт запуска SIPклиента, точнее скрипта в котором запускается SIPклиент.

http://IP&DNS/zabbix - user&pass - Администрирование - Скрипты - Создать скрипт

  • Имя: Call
  • Тип: Скрипт
  • Выполнять на: Zabbix сервер
  • Команды: /usr/lib/zabbix/externalscripts/call
  • Описание: Звонок на 2006@172.33.33.2 - echo "1" > /tmp/a.log
  • Группа пользователей: Все
  • Группа узлов сети: Все
  • Требуемые права доступа к узлам сети: Чтение

и нажимаю «Добавить«.

Шаг №7: Создаю «Действие» посредством которого, если сработал указанный триггер выполнится скрипт «Шаг №1«:

http://IP&DNS/zabbix - user&pass - Настройка - Действия - Создать действие -

вкладка «Действие»

  • Имя: Report Asterisk
  • Условия: Триггер равно raspberry:"Температура с Датчика 1 более 25"

вкладка «Операции»

(операции) Новый

  • Тип операции: Удаленная команда
  • Списк целей: Узел сети: raspberry
  • Тип: Глобальный скрипт
  • Имя скрипта: Call

Шаг №8: Проверяю, зажимаю пальцами датчик DHT 11 и через некоторое время температура повышается:

pi@raspberrypi:~ $ sudo /usr/lib/zabbix/externalscripts/dht.py 11 4

Temp=22.0* Humidity=50.0%

pi@raspberrypi:~ $ sudo /usr/lib/zabbix/externalscripts/dht.py 11 4

Temp=23.0* Humidity=87.0%

pi@raspberrypi:~ $ sudo /usr/lib/zabbix/externalscripts/dht.py 11 4

Temp=25.0* Humidity=88.0%

pi@raspberrypi:~ $ sudo /usr/lib/zabbix/externalscripts/dht.py 11 4

Temp=26.0* Humidity=90.0%

pi@raspberrypi:~ $ sudo /usr/lib/zabbix/externalscripts/dht.py 11 4

Temp=27.0* Humidity=89.0%

и срабатывает «Действие»

ekzorchik@srv-asterisk:~$ sudo asterisk -rvvvv

Asterisk 16.6.2, Copyright (C) 1999 - 2018, Digium, Inc. and others.

Running as user 'asterisk'

Running under group 'asterisk'

Connected to Asterisk 16.6.2 currently running on srv-asterisk (pid = 809)

== Using SIP RTP CoS mark 5

> 0x7fa9500370f0 -- Strict RTP learning after remote address set to: 172.33.33.117:7078

-- Executing [2006@phones:1] Wait("SIP/2005-00000015", "1") in new stack

-- Registered SIP '2005' at 172.33.33.117:5060

[Dec 3 12:20:21] NOTICE[869]: chan_sip.c:24889 handle_response_peerpoke: Peer '2005' is now Reachable. (10ms / 2000ms)

-- Executing [2006@phones:2] NoOp("SIP/2005-00000015", "{DATETIME}}") in new stack

-- Executing [2006@phones:3] System("SIP/2005-00000015", "echo "1" > /tmp/a.log") in new stack

-- Executing [2006@phones:4] Hangup("SIP/2005-00000015", "") in new stack

== Spawn extension (phones, 2006, 4) exited non-zero on 'SIP/2005-00000015'

-- Unregistered SIP '2005'

srv-asterisk*CLI>

Итого действиями выше я проработал практическое сопряжение sip-клиента который устанавливаю на сам Zabbix Server 4.4 on Ubuntu 18.04 и выполняемое действие на триггер. В последующей заметке уже будет инициализация звонка с предопределенным голосовым сообщением, а может и IVR меню. Пока заметку считаю выполненной и прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.