Оповещения Zabbix по телефону через Asterisk

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

Наведу пример варианта оповещений 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 -avh -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 -avh /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 раз.

Примеры триггеров для Zabbix

Приведу несколько примеров триггеров для Zabbix.

Допустим есть элементы данных, исходя из них будем создавать триггеры.

Пример триггера сообщающего что трафик на порту коммутатора больше допустимого:

Имя: Трафик входящего порта > 70 Mb/s на офисе {HOSTNAME}
Выражение: ({Mikrotik RB2011L-IN office:ifInOctets.1.last()}>70M)

Триггер сообщающий о пропаже линка на порту коммутатора, когда значение не равно 1 (замечу что когда пропал линк статус может быть иным от 2, например когда порт заблокирован и т.д., например 1-up, 2-down, 3-testing, 4-unknown, 5-dormant, 6-notPresent, 7-lowerLayerDown):

Пропал линк к ТОВ Телесети (21 порт) на {HOSTNAME}
({192.168.2.22:ifOperStatus.21.last(0)}<>1)

Чтобы Zabbix сообщил о появлении линка:

Появился линк к ТОВ Телесети (21 порт) на {HOSTNAME}
({192.168.2.22:ifOperStatus.21.last(0)}=1)

Триггер при большой загрузке процессора:

Загрузка процессора на {HOSTNAME} выше 70
{192.168.2.22:cpu.last(0)}>70

Мониторинг размера MySQL базы или таблицы в Zabbix

Чтобы увидеть таблицу со списком баз данных и их размером в мегабайтах можно выполнить SQL запрос:

SELECT table_schema "databases name", sum(data_length + index_length)/1024/1024  "DВ size in MB" FROM information_schema.TABLES GROUP BY table_schema;

Посмотреть размер таблиц конкретной базы, например zabbix, можно выполнив SQL:

SELECT table_name AS `Table`, round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` FROM information_schema.TABLES WHERE table_schema = "zabbix";

Либо в байтах увидеть размер одой базы с именем zabbix:

SELECT SUM( data_length + index_length ) AS 'size'
FROM information_schema.TABLES
WHERE table_schema = 'zabbix'
LIMIT 1;

Чтобы увидеть размер конкретной таблицы базы, например zabbix.history:

SELECT SUM( data_length + index_length ) AS 'size'
FROM information_schema.TABLES
WHERE table_schema = 'zabbix' AND table_name = 'history'
LIMIT 1;

Примеры предыдущих запросов мы и используем для мониторинга. Создадим в директории скриптов Zabbix скрипт, например с именем zabbix_database_size.sh и содержимым:

mysql -u root -pPASSWORD -h 127.0.0.1 -e "SELECT SUM( data_length + index_length ) AS 'size' FROM information_schema.TABLES WHERE table_schema = 'zabbix' LIMIT 1;" -s -N

В Zabbix узлу сети или в новом шаблоне создадим элемент данных в котором укажем:

Имя: Zabbix Database Size
Тип: Внешняя проверка
Ключ: zabbix_database_size.sh
Тип информации: Числовой (целое положительное)
Единица измерения: b

Соответственно создадим для него график.

Все.

Мониторинг Samba в Zabbix

Приведу пример наблюдения за количеством запущенных Samba процессов, а также создания триггера сообщающего когда нет запущенных процессов.
В системе с Samba должен быть установлен Zabbix-агент.
Смотрите мои популярные статьи о Zabbix.

Создадим шаблон, например с именем «Template Service Samba» и добавим в него следующий элемент данных:

Имя: Количество процессов nmbd
Тип: Zabbix агент
Ключ: proc.num[nmbd]

Аналогично создадим и для smbd.
Можно также создать элементы данных отображающие количество использованной памяти процессом, в этом случае ключ будет выглядеть так:

proc.mem[nmbd,,sum]

А также добавим для них графики.

Теперь добавим для каждого процесса триггер, чтобы видеть когда процесс не запущен:

Имя: Не работает nmbd на {HOST.NAME}
Выражение: {Template Service Samba:proc.num[nmbd].max(1)}<1

Все.

Мониторинг количества клиентов секторной Ubiquiti по SSH из Zabbix

На тесте приведу пример получения количества клиентов подключенных к обычной секторной антенне Ubiquiti AirMax Rocket M5.
Получать данные будем через SSH.

Для проверки один раз подключимся к устройству (первый раз при подключении наберем yes и нажмем enter):

sudo -u zabbix ssh -p 22 admin@192.168.0.55

Теперь в Zabbix добавим элемент данных к шаблону или хосту, например с именем «Template Ubiquiti Rocket M5 Sector»:

Имя: любое
Тип: SSH агент
Ключ: ssh.run[clients,,22,utf8]
Метод аутентификации: Пароль
Имя пользователя: ИМЯ
Пароль: ПАРОЛЬ
Выполняемый скрипт: команда выполняемая на устройстве (смотрите ниже)

Пример команды отображаемой количество подключенных клиентов:

wstalist |grep "mac" |wc -l

Соответственно создадим график элементу данных, а также триггер:

Имя: На секторной антенне  {HOST.NAME} > 40 клиентов
Выражение: {Template Ubiquiti Rocket M5 Sector:ssh.run[clients,,22,utff8].last(#1)}>40

Смотрите также:
Настройка SSH проверок в Zabbix

Мониторинг BGP в Zabbix

Приведу пример простой проверки запущено ли что-то на TCP порту 179 который использует BGP.

Создадим в новом шаблоне Zabbix или прямо в узле сети следующий элемент данных с именем «Template App BGP Service» (где 192.168.10.2 адрес узла сети на котором проверяется работоспособность BGP):

Имя: BGP service is running
Тип: Zabbix агент
Ключ: net.tcp.service[tcp,192.168.10.2,179]
Тип информации: Числовой (целое положительное)
Тип данных: Десятичный
Отображение значения: Service state

Если элемент данных сообщает 0, то значит BGP не работает либо порт закрыт, если 1 — все в порядке.

Соответственно добавим триггер который будет уведомлять о неработающем BGP:

Имя: Не работает BGP на {HOST.NAME}
Выражение: {Template App BGP Service:net.tcp.service[tcp,192.168.10.2,179].max(#3)}=0

Все.

Решение ошибки в Zabbix «snmp_parse_oid(): cannot parse OID «MIB»»

Заметил однажды на новой системе после импорта Zabbix шаблонов что не все элементы данных успешно работают.

И отображается ошибка:

snmp_parse_oid(): cannot parse OID «MIB»

Как оказалось в элементах данных указаны MIB вместо OID, которых нет в системе.
Приведу пример, MIB для входящего трафика на первом интерфейсе будет ifInOctets.1, а OID 1.3.6.1.2.1.2.2.1.10.1
Тут более подробно можно увидеть примеры Список SNMP OID и MIB для интерфейсов
Поэтому вариантом решения данной ошибки будет либо редактирование всех элементов шаблона изменим MIB на OID, либо вариант проще — установить MIB которых нет в системе, если это стандартные MIB то их можно установить как я описывал в этой статье — Установка MIB в Ubuntu и решение ошибки «SNMP Cannot Find Module …»

В конце обязательно перезапустим snmpd и zabbix-server:

sudo service snmpd restart
sudo service zabbix-server restart

Все.