+7(423) 257-22-77
Владивосток | Артем
Обратная связь

Настройка Zabbix для мониторинга SIP транков в Астериск


Актуальность статьи: 2017 год
Версия Zabbix 3.2
Версия Астериск: Asterisk 11.20.0 built by palosanto
Версия Linux: CentOS7 (дистрибутив Elastix)

1. Какой результат получим

Будем мониторить состояние транка. Триггер сработает, если состояние не Registered
Будем мониторить сервер SIP провайдера. Делать ping, замерять потери (icmpping в Zabbix)

2. Настройки на сервере Астериск (zabbix агент должен быть установлен)

Создадим папку для пользовательских скриптов в каталоге zabbix:

mkdir /etc/zabbix/scripts

Создаем скрипт asterisk_trunk_discovery.sh

touch /etc/zabbix/scripts/asterisk_trunk_discovery.sh

Содержимое скрипта

#!/bin/bash
    fun_error1(){
        echo "Ошибка! Отсутствуют параметры (trunks или ips или registration_monitoring)"
    }
    fun_error2(){
        echo "Ошибка! Отсутствуют параметры (название_транка)"
    }

    if [ $# -ne 0 ]
    then
        case $1 in
        trunks)
            /usr/bin/sudo asterisk -rx "sip show registry" | sed -e 1d -e '$d' | awk -v ORS="" 'BEGIN { print "{\"data\":["} { print "{\"{#TRUNKNAME}\":\""$3"\"}," } END { print "]}" }' | sed 's/,]}$/]}\n/' ;;
        ips)
            /usr/bin/sudo asterisk -rx "sip show registry" | sed -e 1d -e '$d' | awk ' BEGIN { print "{\"data\":[" } !seen[$1]++ { gsub(/:.+/, "", $1); print "{\"{#TRUNKIP}\":\""$1"\"}," } END { print "]}" }' | tr -d '\n' | sed 's/,]}$/]}\n/' ;;
        registration_monitoring)
            if [ $# -eq 2 ]
            then
                /usr/bin/sudo asterisk -rx "sip show registry" |grep -w $2 | awk '{print $5}'
            else
                fun_error2
            fi ;;
        *)
            fun_error1 ;;
        esac
    else
        fun_error1
    fi
    

Ставим права доступа

chown zabbix.zabbix /etc/zabbix/scripts/asterisk_trunk_discovery.sh
chmod 500 /etc/zabbix/scripts/asterisk_trunk_discovery.sh

Разрешаем пользователю zabbix, от имени которого будет работать скрипт, запускать asterisk. Команда ниже добавляет в файл /etc/sudoers в самый конец нужную строку:

echo -ne "\nzabbix ALL = NOPASSWD: /usr/sbin/asterisk\n" >> /etc/sudoers

В файл zabbix_agentd.conf добавляем строку

UserParameter=asterisk_trunk_discovery[*],/etc/zabbix/scripts/asterisk_trunk_discovery.sh $1

И перезапускаем zabbiz агент (для CentOS 7 даем такую команду)

systemctl restart zabbix-agent

3. Настройки на Zabbix сервере (в Web интерфейсе Zabbix)

Будем использовать Низкоуровневое Обнаружение. Создадим Шаблон, два Правила обнаружения, Прототипы элементов данных и Прототипы триггеров.

3.1. Создаем шаблон с именем Asterisk Trunks Discovery

3.2. Создаем первое Правило обнаружения

Шаблоны-> Asterisk Trunks Discovery->Правила Обнаружения->Создать правило обнаружения

Имя Правила обнаружения – любое. Ключ: asterisk_trunk_discovery[trunks]

Создаем Прототип элементов данных. Имя любое. Ключ: asterisk_trunk_discovery[registration_monitoring {#TRUNKNAME}]. Тип информации: Текст

Создаем Прототип триггера. Имя: Транк {#TRUNKNAME}. Выражение: {Asterisk Trunks Discovery:asterisk_trunk_discovery[registration_monitoring {#TRUNKNAME}].str(Registered)}<>1

3.3. Создаем второе Правило обнаружения

Имя Правила обнаружения – любое. Ключ: asterisk_trunk_discovery[ips]

Создаем три Прототипа элемента данных. Имя любое. Тип: Простая проверка. Ключи (по одному на каждый):

Создаем Прототипы Триггеров к этим Прототипам элементов данных (по своему вкусу)


3.4. Применяем шаблон к узлу сети

3.5. Любуемся результатом :-)

4. Заключение

В заключение статьи даю пояснения к командам из скрипта

/usr/bin/sudo asterisk -rx "sip show registry" | sed -e 1d -e '$d' | awk -v ORS="" 'BEGIN { print "{\"data\":[" } { print "{\"{#TRUNKNAME}\":\""$3"\"}," } END { print "]}" }' | sed 's/,]}$/]}\n/'

- asterisk -rx "sip show registry" – показывает зарегистрированные на Астериске транки

- sed -e 1d -e '$d' – удаляет первую и последнюю строку

- awk -v ORS="" 'BEGIN { print "{\"data\":[" } { print "{\"{#TRUNKNAME}\":\""$3"\"}," } END { print "]}" }' – формируем строку в JSON формате

- sed 's/,]}$/]}\n/' – удаляем последнюю запятую из строки в JSON формате и добавляем новую строку для удобства чтения. (заменяет в конце строки ,]} на ]}\n )

/usr/bin/sudo asterisk -rx "sip show registry" | sed -e 1d -e '$d' | awk ' BEGIN { print "{\"data\":[" } !seen[$1]++ { gsub(/:.+/, "", $1); print "{\"{#TRUNKIP}\":\""$1"\"}," } END { print "]}" }' | tr -d '\n' | sed 's/,]}$/]}\n/'

- !seen[$1] – удаляет повторяющиеся IP адреса SIP проваедера. Зачем нам по два раза пинговать один и тот же IP?!

- gsub(/:.+/, "", $1) – отсекает порт от IP адреса (:5060)

/usr/bin/sudo asterisk -rx "sip show registry" |grep -w $2 | awk '{print $5}'

- Получает название транка и выводит 5 колонку. Как раз в ней состояние транка.

5. P.S. Ссылки, которые помогли

Официальная документация Zabbix

Мониторинг транков (trunk) в asterisk с помощью zabbix

Мониторинг транков Asterisk с помощью низкоуровнего обнаружения Zabbix