Поднимаем сервер мониторинга Zabbix 7 + TimescaleDB в docker
Обновлено 07.11.2024
Приветствую!
В данной инструкции мы с вами развернем популярную систему мониторинга Zabbix с использованием TimescaleDB – плагина для БД PostgreSQL, позволяющего эффективно работать с “временнЫми рядам”. Все это добро мы завернем внутрь docker контейнеров 🐳. Будет интересно 😉.
Напомню, что в одной из прошлых заметок мы обсуждали, что такое системы мониторинга в IT, какие виды бывают и немного узнали о популярных реализациях на сегодняшний день, среди которых – Zabbix.
Присоединяйтесь к нашему каналу в телеграм: t.me/r4ven_me, уведомления о новых постах приходят туда в день публикации. А если у вас есть вопросы или просто желание пообщаться по тематике – заглядывайте в чат: t.me/r4ven_me_chat.
Сразу прошу обратить внимание на то, что все действия описанные в данном руководстве вы делаете на свой риск и ответственность. Мой блог – лишь площадка, где я рассказываю про свой опыт и делюсь своим мнением по каким-либо вещам и явлениям. Спасибо за понимание.
Иван Чёрный
Введение
Особенностью инсталяции, описываемой в этой статье является не только развертывание системы мониторинга Zabbix в docker контейнерах, но и использование ее в связке с базой данных временных рядов – TimescaleDB.
Прежде чем мы начнем, давайте дадим несколько определений в качестве введения.
Zabbix — это открытая платформа для мониторинга сетей и серверов. Для хранения данных использует реляционные СУБД, например: PostgreSQL, MySQL, MariaDB, Oracle, SQLite и т.д.
Временные ряды в базах данных (time series) — это набор данных, упорядоченных по времени, где значения регистрируются через равные или неравные интервалы времени.
Базы данных временных рядов (time series database) — это специализированные базы данных, предназначенные для эффективного хранения, управления и анализа временных рядов. Часто это no sql базы данных.
TimescaleDB (TSDB) — это расширение для PostgreSQL, которое оптимизирует работу с временными рядами в данной СУБД, сохраняя при этом всю мощь и гибкость классических SQL like баз данных. С определенного времени Zabbix научился работать с данной СУБД.
Цитата из официальной документации Zabbix:
Zabbix supports TimescaleDB, a PostgreSQL-based database solution of automatically partitioning data into time-based chunks to support faster performance at scale.
Zabbix.com
Для лучшего понимания причины выбора именно такой связки, рекомендую статью на Habr: Zabbix, временные ряды и TimescaleDB.
Прошу вас также обратить внимание на предупреждение из оф. документации Zabbix:
Warning: Currently, TimescaleDB is not supported by Zabbix proxy.
Zabbix.com 09.2024
Уверен, что в будущем это поправят. А пока хватит трепа, переходим к делу🤵♂️.
Подготовка
Разворачивать Zabbix будем в среде дистрибутива Debian 12 💿 с установленным Docker engine 🐳. Если у вас еще нет готового Linux сервера, то рекомендую мои предыдущие статьи:
- Установка сервера Debian 12 в VirtualBox
- Начальная настройка Linux сервера на примере Debian
- Установка Docker engine на Linux сервер под управлением Debian
Также для дальнейшей работы нам понадобится пользователь с правами root.
Эй, данная статья является частью цикла о построении своей инфраструктуры. Предыдущие статьи:
- Поднимаем OpenConnect SSL VPN сервер (ocserv) в docker для внутренних проектов
- Поднимаем свой DNS сервер Unbound и блокировщик рекламы Pihole в docker
А вот схема, с учетом добавления на нее сервера мониторинга:
Установка необходимых утилит
Сегодня нам понадобятся утилиты для взаимодействия с веб. Открываем терминал и устанавливаем систему контроля версий git
и утилиту curl
:
sudo apt update && sudo apt install -y git curl
Скачивание файлов проекта
Все файлы проекта находятся в моем репозитории на GitHub. Клонируем его с помощью установленной ранее утилиты git
по пути /opt/zabbix
:
sudo git clone https://github.com/r4ven-me/zabbix /opt/zabbix
docker-compose.yml
– файл описания сервисов, запускаемых в docker контейнерах:- Секция NETWORK – определяет две виртуальные сети docker:
zbx_net_backend
– изолированная сеть для взаимодействия контейнеровpostgres-server,
zabbix-server
,zabbix-web
иzabbix-agent
;zbx_net_frontend
– сеть с доступом к контейнерам со стороны хостовой ОС: для контейнеровzabbix-server
иzabbix-web
.
- Секция SERVICES – определяет параметры запускаемых сервисов/контейнеров:
postgres-server
– сервис СУБД TimescaleDB;zabbix-server
– сервис Zabbix сервера;zabbix-web
– сервис веб интерфейса для Zabbix сервера (под капотом nginx + php-fpm);zabbix-agent
– сервис агента Zabbix для сбора метрик с самого сервера Zabbix.
- Секция SECRETS – определяет файлы, содержащие чувствительную информацию, которые прокидываются внутрь контейнеров
postgres-server
,zabbix-server
иzabbix-web
:POSTGRES_USER
(файл./env/.POSTGRES_USER
) – имя пользователь для базы данных Zabbix в СУБД TimescaleDB;POSTGRES_PASSWORD
(файл./env/.POSTGRES_PASSWORD
) – соответственно, пароль пользователя.
- Секция NETWORK – определяет две виртуальные сети docker:
- env – директория с файлами, содержащие переменные окружения, значения которых передаются внутрь контейнера при его запуске:
.env_db
– параметры дляpostgres-server
;.env_srv
– параметры дляzabbix-server
;.env_web
– параметры дляzabbix-web
;.env_agent
– параметры для локальногоzabbix-agent
;.POSTGRES_PASSWORD
– пароль пользователя в БД zabbix;.POSTGRES_USER
– имя пользователя в БД zabbix.
src
– директория с исходными файлами для сборки кастомного контейнераzabbix-server
с расширенным функционалом:alertscripts
– директория с файлами для отправки уведомлений в Telegram:docker-entrypoint.sh
– скрипт подготовки окружения внутри контейнера (не изменялся);Dockerfile
– кастомизированный файл описания сборки образа;externalscripts
– директория со скриптом мониторинга делегирования домена.
При необходимости, отредактируйте блок deploy
у нужных сервисов в файле docker-compose.yml
, в зависимости от серверных ресурсов, которыми располагаете. По умолчанию используются самые минимальные значения.
Создание сервисного пользователя zabbix
В целях безопасности создаем ограниченные в правах группу и сервисного пользователя для запуска контейнеров zabbix:
sudo addgroup --system --gid 1995 zabbix
sudo adduser --system --gecos "Zabbix monitoring system" \
--disabled-password --uid 1997 --ingroup zabbix \
--shell /sbin/nologin --home /opt/zabbix/zabbix_data zabbix
adgroup
– команда создания группы;
--system
– помечает группу, как системную и применяет к ней установленные политики;--gid 1995
– указывает явный идентификатор группы (GID) – в данном случае 1995 (именно такой GID задают разрабы Zabbix в своих контейнерах);zabbix
– название создаваемой группы;
adduser
– команда создания пользователя
--system
– помечает группу, как системную и применяет к ней установленные политики;--gecos
– позволяет задать описание пользователя;--disabled-password
– отключает пароль у пользователя (в таком случае под ним нельзя авторизоваться в системе с помощью пароля);--uid 1997
– указывает явный идентификатор пользователя (UID) – в данном случае 1997 (именно такой UID задают разрабы Zabbix в своих контейнерах);--ingroup zabbix
– добавляет пользователя в созданную ранее группу zabbix;--shell /sbin/nologin
– в качестве оболочки пользователя устанавливает nologin – под ней невозможно авторизоваться в системе;--home /opt/zabbix/zabbix_data
– задает домашний каталог пользователя, в нашем случае это директория с файлами сервисов zabbix;zabbix
– имя создаваемого пользователя.
Создание сервисного пользователя postgres
Теперь аналогичным образом создаем группу и пользователя для запуска контейнера TimescaleDB:
sudo addgroup --system --gid 70 postgres
sudo adduser --system --gecos "PostgreSQL database" \
--disabled-password --uid 70 --ingroup postgres \
--shell /sbin/nologin --home /opt/zabbix/postgres_data postgres
Проверяем наличие всех нужных файлов и папок:
ls -l /opt/zabbix
Отлично, идем дальше 🚶.
Создание пароля для базы данных Postgres
По умолчанию в файле /opt/zabbix/env/.POSTGRES_PASSWORD
я задал для БД zabbix одноименный пароль. Но крайне рекомендую сгенерировать новый, например такой командой:
tr -cd "[:alnum:]" < /dev/urandom | head -c 30 \
| sudo tee /opt/zabbix/env/.POSTGRES_PASSWORD
Команда tr -cd
с помощью механизма перенаправления стандартных потоков получает на ввод латинские буквы и цифры (класс символов [:alnum:]
), генерируемые псевдоустройством /dev/urandom
. Затем команда head
, получая данные по конвейеру, с помощью ключа -c
отбирает 30 первых символов (байт). И в конце, полученная псевдорандомная строка передается на ввод команде tee
, запущенной от имени суперпользователя. Полученные данные tee
записывает в указанный файл (/opt/zabbix/env/.POSTGRES_PASSWORD
) и дублирует вывод в стандартный поток (stdout).
Не обращайте внимания на символ
%
в конце строки моего примера. Это особенность командной оболочки ZSH, которая выводит его (или#
для root) при отсутствии символа перевода строки.
Запуск Zabbix стека с помощью docker compose
Старт Postgres сервера
Первым запускаем сервер СУБД, такой командой:
sudo docker compose -f /opt/zabbix/docker-compose.yml up -d postgres-server
После загрузки образа и запуска контейнера смотрим его вывод:
sudo docker logs -f postgres-server
При успешном запуске, вы увидите подобное:
При первом старте, внутри контейнера выполняются скрипты подготовки окружения и базовой конфигурации СУБД в зависимости от параметров сервера. В одном из моих тестов такой скрипт выставлял параметр max_connections
равным 25
– чего недостаточно даже для импорта схемы БД zabbix и процесс выпадет в ошибку:
FATAL: sorry, too many clients already
Проверить значение max_connections
можно такой командой:
sudo grep 'max_connections' /opt/zabbix/postgres_data/postgresql.conf
Если у вас <=25
, то этот параметр необходимо увеличить. Открываем файл на редактирование любым консольным редактором, например, Vim/Neovim 😎:
sudo vim /opt/zabbix/postgres_data/postgresql.conf
Находим там строку:
max_connections = 25
И меняем ее, например, на:
max_connections = 200
Сохраняем файл, выходим из редактора.
Для применения изменений перезапускаем контейнер postgres-server
и проверяем текущее значение max_connections
:
sudo docker compose -f /opt/zabbix/docker-compose.yml restart postgres-server
sudo docker exec -it postgres-server psql -U zabbix -c "SHOW max_connections;"
Все применилось, переходим к запуску контейнера zabbix-server
.
Старт Zabbix сервера
Запускаем его такой командой:
sudo docker compose -f /opt/zabbix/docker-compose.yml up -d zabbix-server
Смотрим вывод контейнера:
sudo docker logs -f zabbix-server
При первом запуске, котейнер запустит создание базы. Это займет некоторое время. Вывод остановится на такой строке:
Creating 'zabbix' schema in PostgreSQL
Обязательно дождитесь завершения процедуры создания БД!
При успешном запуске вы должны увидеть что-то подобное:
Возможно в самом конце будет вывод, подобный этому:
256:20240922:121849.602 Zabbix agent item "system.cpu.util[,system]" on host "Zabbix server" failed: first network error, wait for 15 seconds
225:20240922:121855.944 item "Zabbix server:zabbix[vmware,buffer,pused]" became not supported: No "vmware collector" processes started.
225:20240922:121858.958 item "Zabbix server:zabbix[process,report writer,avg,busy]" became not supported: No "report writer" processes started.
225:20240922:121859.962 item "Zabbix server:zabbix[process,report manager,avg,busy]" became not supported: No "report manager" processes started.
256:20240922:121904.599 Zabbix agent item "system.users.num" on host "Zabbix server" failed: another network error, wait for 15 seconds
256:20240922:121919.602 Zabbix agent item "system.cpu.load[all,avg5]" on host "Zabbix server" failed: another network error, wait for 15 seconds
225:20240922:121928.010 item "Zabbix server:zabbix[connector_queue]" became not supported: connector is not initialized: please check "StartConnectors" configuration parameter
225:20240922:121929.016 item "Zabbix server:zabbix[process,connector manager,avg,busy]" became not supported: No "connector manager" processes started.
225:20240922:121930.021 item "Zabbix server:zabbix[process,connector worker,avg,busy]" became not supported: No "connector worker" processes started.
256:20240922:121934.600 temporarily disabling Zabbix agent checks on host "Zabbix server": interface unavailable
Не обращаем на него внимания.
Проверяем статус запущенных контейнеров:
sudo docker ps
Все ок – идем дальше.
Создание схемы для TimescaleDB
Выводим созданный ранее пароль в терминал, скоро он нам понадобится. Затем подключаемся к оболочке контейнера zabbix-server
:
sudo cat /opt/zabbix/env/.POSTGRES_PASSWORD
sudo docker exec -it zabbix-server bash
Теперь импортируем схему TimescaleDB с помощью SQL скрипта, который разработчики Zabbix любезно положили в системные файлы. При вводе команды импорта у нас запросят пароль от БД, который мы вывели на предыдущем шаге:
psql -h postgres-server -U zabbix zabbix < /usr/share/doc/zabbix-server-postgresql/timescaledb.sql
Процесс импорта представляет собой простое перенаправление содержимого SQL скрипта на вводе команды подключения к БД с помощью psql
.
Вывод должен быть таким:
Выходим из контейнера zabbix-server
и проверяем наличие информации о чанках (chunks) в Postgres:
exit
sudo docker exec -it postgres-server \
psql -U zabbix -c "SELECT * FROM chunks_detailed_size('history')"
Если вывод у вас такой же, как на скрине выше, то все импортировалось успешно 🥳.
На этом этапе БД Postgres/TimesacleDB и Zabbix сервер готовы 😉.
Старт всего стека TimesacleDB + Zabbix server + Zabbix web + Zabbix agent
Останавливаем запущенные контейнеры и запускаем всю инсталляцию, включая Zabbix web и Zabbix agent:
sudo docker compose -f /opt/zabbix/docker-compose.yml down
sudo docker compose -f /opt/zabbix/docker-compose.yml up -d
Проверяем все ли контейнеры запустились корректно:
sudo docker ps
sudo docker compose -f /opt/zabbix/docker-compose.yml logs -f
Отлично. Теперь проверим работу самого Zabbix:
curl -I http://localhost:8080
nc -zv localhost 10051
ss -tulnap | grep -E '8080|10051'
Первой командой мы проверили доступность веб интерфейса из консоли, второй – доступность порта
zabbix-server
, а третьей вывели порты, прослушиваемые хостовой ОС.
Отлично, все работает 🎉🎉🎉.
Доступ к веб интерфейсу Zabbix
Способ получения доступа к веб интерфейсу Zabbix зависит от условий, в которых вы разворачивали стек. Я опишу несколько очевидных вариантов.
Клик по синему спойлеру для просмотра инструкции.
Просто вбейте в браузере URL 😁😁😁:
http://127.0.0.1:8080/
В таком случае отредактируйте настройки сети для сервисов zabbix-server
и zabbix-web
в docker-compose.yml
файле.
Например, внутренний адрес моего сервера в сети VPN: 192.168.122.24
. Правлю docker-compose.yml
:
sudo vim /opt/zabbix/docker-compose.yml
zabbix-server:
zabbix-web:
Перезапускаю все контейнеры:
sudo docker compose -f /opt/zabbix/docker-compose.yml down
sudo docker compose -f /opt/zabbix/docker-compose.yml up -d
sudo docker ps
На подключенном к VPN сети клиенте открываю в браузере такой URL:
http://192.168.122.24:8080/
При таком раскладе можно прокинуть SSH порт либо открыть доступ напрямую или через обратный прокси, наподобие nginx. Я рассмотрю лишь первый случай, как самый простой. А еще потому, что два других выходят за рамки данной статьи 😜.
На клиенте открываем терминал и выполняем:
ssh -L 8080:127.0.0.1:8080 user@example.com
Где (по порядку):
-L
– ключ перенаправления локального порта;8080
– порт, который будет слушать клиентская машина и перенаправлять его на8080
порт сервера;127.0.0.1
– адрес сервера, на котором он слушает порт;8080
– соответственно порт, на который перенаправляем;user@example.com
– пользователь и адрес SSH сервера.
В моём примере команда такая:
Теперь открываем браузер и переходим по адресу: http://127.0.0.1:8080/
Доступ к веб интерфейсу будет пока открыта SSH сессия.
Для авторизации в веб интерфейсе используйте стандартные логин: Admin
и пароль: zabbix
Если вы увидели такое:
Мои поздравления 😎! Zabbix сервер с TimescaleDB поднят и готов к работе 👷♂️.
Опционально
Ниже приведены необязательные, но рекомендованные шаги инструкции 😉.
Минимальная начальная настройка Zabbix сервера
Не буду сильно вдаваться в подробности настройки Zabbix, т.к. это тема не одной статьи 🤯. Покажу лишь как поменять язык интерфейса, создать нового пользователя с админскими правами, отключить стандартного Admin и настроить локальный Zabbix agent для мониторинга самого Zabbix сервера.
Все действия отображены в картинках и особо в комментариях не нуждаются 😏.
Смена языка
Создание новго пользователя
И перезаходим в интерфейс уже под новым пользователем:
Отключение стандартного пользователя Admin
Подключение локального Zabbix agent
Данный агент был поднят нами, в момент запуска всей инсталяции и доступен по доменному имени zabbix-agent
внутри сети контейнеров.
Тут обязательно выбираем “Подключаться через” – DNS:
Теперь переходим на страницу “Мониторинг” – “Проблемы”. Через несколько минут проблема с доступностью локального zabbix-agent
должна решиться:
Настройка автозапуска Zabbix стека с systemd
В начале статьи мы создали сервисного пользователя zabbix. Используем его для безопасного запуска сервисов стека Zabbix.
Настройка sudoers для запуска Zabbix от сервисного пользователя
Недавно я разбирал тонкости механизма повышения привилегий в Linux. Для лучшего понимания дальнейших действию рекомендую к прочтению: Командная строка Linux, повышение привилегий: команды su, sudo 😌.
Создаем новый файл с описанием ограниченных полномочий для пользователя zabbix:
sudo visudo -f /etc/sudoers.d/zabbix
И наполняем следующим:
Cmnd_Alias ZBX = \
/usr/bin/docker compose -f /opt/zabbix/docker-compose.yml up, \
/usr/bin/docker compose -f /opt/zabbix/docker-compose.yml down
zabbix ALL = (:docker) NOPASSWD: ZBX
Разрешаем пользователю zabbix запуск и остановку сервисов, описанных в нашем
docker-compose.yml
, от имени привилегированной группы docker с помощьюsudo
.
Сохраняем файл и закрываем редактор.
Создание systemd service файла
Открываем на редактирование:
sudo vim /etc/systemd/system/zabbix.service
И наполняем:
[Unit]
Description=Zabbix service
Requires=docker.service
After=docker.service
[Service]
Restart=always
RestartSec=5
User=zabbix
ExecStart=/usr/bin/sudo --group=docker /usr/bin/docker compose -f /opt/zabbix/docker-compose.yml up
ExecStop=/usr/bin/sudo --group=docker /usr/bin/docker compose -f /opt/zabbix/docker-compose.yml down
[Install]
WantedBy=multi-user.target
Сохраняем, закрываем. После этого останавливаем запущенные контейнеры, перечитываем конфигурацию systemd, активируем автозапуск сервиса zabbix и запускаем его:
sudo docker compose -f /opt/zabbix/docker-compose.yml down
sudo systemctl enable --now zabbix
sudo systemctl status zabbix
Проверяем статус контейнеров:
sudo docker ps
Все запущено. Вот и славно 🙂.
Установка и запуск Zabbix agent в docker на удаленном хосте
Раз уж мы разворачивали Zabbix в docker, логичным действием будет поднятие Zabbix агентов аналогичным способом.
Очевидно, для этого необходим установленный и запущенный Docker engine.
Скачивание файлов проекта и создание сервисного пользователя
Клонируем репозиторий с файлами:
sudo git clone https://github.com/r4ven-me/zabbix-agent /opt/zabbix-agent
Как и в случае сервера, создаем сервисного пользователя для запуска Zabbix агента:
sudo addgroup --system --gid 1995 zabbix
sudo adduser --system --gecos "Zabbix agent" \
--disabled-password --uid 1997 --ingroup zabbix \
--shell /sbin/nologin --home /opt/zabbix-agent/data zabbix
Корректируем .env
файл – файл с параметрами Zabbix агента.
sudo vim /opt/zabbix-agent/.env
Тут обязательно задаем существующий IP адрес хоста, на котором сервис Zabbix agent будет ожидать подключений. Также указываем хостнейм агента и адрес Zabbix сервера.
В моем примере такие данные:
- адрес Zabbix сервера:
192.168.122.24
- адрес Zabbix агента:
192.168.122.105
- хостнейм Zabbix агента:
zabbix-agent.example.com
Описание всех параметров смотрите тут.
Теперь на всякий случай проверяем готовый sudoers файл и если все ок – копируем его в /etc/sudoers.d/
:
sudo visudo -c -f /opt/zabbix-agent/zabbix_agent
sudo cp /opt/zabbix-agent/zabbix_agent /etc/sudoers.d/
Далее копируем файл сервиса systemd, перечитываем конфигурацию и запускаем zabbix-agent
:
sudo cp /opt/zabbix-agent/zabbix-agent.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now zabbix-agent
Имейте ввиду, что при первом запуске docker будет качать образ из реестра.
Проверить статус агента можно такими командами:
sudo systemctl status zabbix-agent
sudo journalctl -fu zabbix-agent
sudo docker ps
Zabbix agent запущен.
Нюанс. Если у вас на сервере примонтировано множество внешних разедлов, необходимо их добавить в блок volume
в docker-compose.yml
, чтобы Zabbix агент их обнаружил.
Добавление Zabbix агента на Zabbix сервер
Тут почти все в картинках 😇.
Переходим в “Мониторинг” – “Узлы сети” и через некоторое время:
Уря!🥳🥳🥳
Настройка отправки уведомлений Zabbix в Telegram с графиком
А теперь интересное 🧐. Для реализации возможности отправки аварийных уведомлений в Telegram с графиками, я пересобрал контейнер zabbix-server
, добавив в него интерпретатор Python, специальный venv и файлы из GitHub репозитория разработчика xxsokolov – данный способ отмечен на официальном сайте Zabbix, как валидный 👌.
В инструкции ниже, рассмотрен вариант использования моего образа: r4venme/zabbix-server-pgsql:alpine-7.0.3, но вы также можете собрать собственный. Все файлы для сборки вы найдете в скачанном репозитории из начала статьи, в папке src
.
Приступаем к настройке.
Создание типа оповещения (веб интерфейс)
- Имя (произвольное):
Alerter
- Тип:
Скрипт
- Имя скрипта:
zbxTelegram.py
- Параметры скрипта:
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
Далее переходим на вкладку шаблоны и добавляем 2 штуки: для проблем и для восстановления:
Шаблон для проблем:
- Тип сообщения: Проблема
- Тема:
{Problem} Проблема ({TRIGGER.SEVERITY})
- Сообщение:
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<body>
<messages>
<![CDATA[
Проблема: {EVENT.NAME}
Хост: {HOST.NAME} ({HOST.IP})
Начало: {EVENT.TIME} {EVENT.DATE}
Последнее значение: {ITEM.LASTVALUE1}
###########################
]]>
</messages>
</body>
<settings>
<graphs>True</graphs>
<hostlinks>True</hostlinks>
<graphlinks>False</graphlinks>
<acklinks>True</acklinks>
<eventlinks>True</eventlinks>
<triggerlinks>True</triggerlinks>
<eventtag>False</eventtag>
<eventidtag>False</eventidtag>
<itemidtag>False</itemidtag>
<triggeridtag>False</triggeridtag>
<actionidtag>False</actionidtag>
<hostidtag>False</hostidtag>
<zntsettingstag>True</zntsettingstag>
<zntmentions>True</zntmentions>
<keyboard>True</keyboard>
<graphs_period>default</graphs_period>
<host>{HOST.HOST}</host>
<itemid>{ITEM.ID1} {ITEM.ID2} {ITEM.ID3} {ITEM.ID4}</itemid>
<triggerid>{TRIGGER.ID}</triggerid>
<eventid>{EVENT.ID}</eventid>
<actionid>{ACTION.ID}</actionid>
<hostid>{HOST.ID}</hostid>
<title><![CDATA[{HOST.NAME} - {EVENT.NAME}]]></title>
<triggerurl><![CDATA[{TRIGGER.URL}]]></triggerurl>
<eventtags><![CDATA[{EVENT.TAGS}]]></eventtags>
</settings>
</root>
После заполнения нажимаем “Добавить”:
Затем еще раз “Добавить” следующий:
Шаблон восстановления:
- Тип сообщения: Восстановление проблемы
- Тема:
{Resolved} Восстановление
- Сообщение:
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<body>
<messages>
<![CDATA[
Проблема: {EVENT.RECOVERY.NAME}
Хост: {HOST.NAME} ({HOST.IP})
Продолжительность: {EVENT.DURATION}
Время восстановления: {EVENT.RECOVERY.TIME} {EVENT.RECOVERY.DATE}
Последнее значение: {ITEM.LASTVALUE1}
###########################
]]>
</messages>
</body>
<settings>
<graphs>True</graphs>
<hostlinks>True</hostlinks>
<graphlinks>False</graphlinks>
<acklinks>True</acklinks>
<eventlinks>True</eventlinks>
<triggerlinks>True</triggerlinks>
<eventtag>False</eventtag>
<eventidtag>False</eventidtag>
<itemidtag>False</itemidtag>
<triggeridtag>False</triggeridtag>
<actionidtag>False</actionidtag>
<hostidtag>False</hostidtag>
<zntsettingstag>True</zntsettingstag>
<zntmentions>True</zntmentions>
<keyboard>True</keyboard>
<graphs_period>default</graphs_period>
<host>{HOST.HOST}</host>
<itemid>{ITEM.ID1} {ITEM.ID2} {ITEM.ID3} {ITEM.ID4}</itemid>
<triggerid>{TRIGGER.ID}</triggerid>
<eventid>{EVENT.ID}</eventid>
<actionid>{ACTION.ID}</actionid>
<hostid>{HOST.ID}</hostid>
<title><![CDATA[{HOST.NAME} - {EVENT.NAME}]]></title>
<triggerurl><![CDATA[{TRIGGER.URL}]]></triggerurl>
<eventtags><![CDATA[{EVENT.TAGS}]]></eventtags>
</settings>
</root>
Далее “Добавить”:
И в конце еще раз тут:
Должно получиться вот так:
Создание сервисного пользователя (веб интерфейс)
Теперь создадим сервисного пользователя с для отправки уведомлений:
Заполняем все нужные поля:
От выбора темы зависит фон графиков в уведомлениях.
После этого переходим на вкладку “Оповещения” и в поле “Отправлять на” указываем Telegram ID чата или группы (инструкция с оф. сайта Zabbix, как получить ID):
Дальше переходим в “Права доступа”. Вот тут по-хорошему, необходимо сначала настроить ограниченные группы и роли пользователей. Но это тонкий процесс, и он тоже выходит за рамки статьи. Для быстрого решения я выдаю сервисному пользователю “суперадминские” права, т.к. для работы скрипта нужны права на чтение для узлов сети и шаблонов. Тут уже на ваше усмотрение.
И в конце клик на основной “Добавить”:
Настройка условий оповещений (веб интерфейс)
Идем в “Действия триггеров” и создаем новое:
Задаем имя и добавляем условие. В условии указываем 2 шаблона, как на скрине:
Далее переходим на вкладку “Операции” и там добавляем 2 действия: для “Операции” и “Операции восстановления”:
Указываем адресата – нашего сервисного пользователя, у которого прописывали ID группы/чата в телеге. Тут же указываем способ отправки: тот, что мы создали ранее:
Примерно так:
Правка docker-compose.yml (консоль сервера)
Возвращаемся на сервер и открываем на редактирование:
sudo vim /opt/zabbix/docker-compose.yml
Правим сервис zabbix-server
, блок image
. Текущую строку комментируем, и расскоменнтирываем строку с адресом собранного мной образа:
# image: zabbix/zabbix-server-pgsql:alpine-7.0.3
image: r4venme/zabbix-server-pgsql:alpine-7.0.3
Сохраняем и перезапускаем zabbix-server
:
sudo systemctl restart zabbix
sudo journalctl -fu zabbix
sudo docker ps
После запуска создаем папку скриптов алармов, из докер контейнера zabbix-server
копируем туда конфиг файл скрипта отправки уведомлений в телегу и меняем его владельца:
sudo mkdir -p /opt/zabbix/zabbix_data/server/alertscripts/
sudo docker cp zabbix-server:/usr/lib/zabbix/alertscripts/zbxTelegram_config.py \
/opt/zabbix/zabbix_data/server/alertscripts/
sudo chown -R zabbix:zabbix /opt/zabbix/zabbix_data/server/alertscripts/
Вновь открываем docker-compose.yml
:
sudo vim /opt/zabbix/docker-compose.yml
Для сервиса zabbix-server
и в блоке volume
расскоментирываем такую строку:
- ./zabbix_data/server/alertscripts/zbxTelegram_config.py:/usr/lib/zabbix/alertscripts/zbxTelegram_config.py
Не забываем сохраниться.
Настройка отправки (консоль сервера)
Осталось совсем чуть-чуть 🥺.
Открываем на редактирование скопированный конфиг файл:
sudo vim /opt/zabbix/zabbix_data/server/alertscripts/zbxTelegram_config.py
И указываем токен своего бота (как получить) в строке tg_token
внутри одинарных кавычек:
Прокручиваем файл вниз и также указываем сервисного пользователя и пароль, которые мы создали ранее:
zabbix_api_url
– это внутренний сетевой адрес контейнера. Не трогаем, если вы его не меняли.
Пересоздаем контейнер zabbix-server
:
sudo docker compose -f /opt/zabbix/docker-compose.yml down zabbix-server
sudo docker compose -f /opt/zabbix/docker-compose.yml up -d zabbix-server
Проверка (консоль сервера)
Проверяем отправку сообщений в командной строке:
sudo docker exec -it zabbix-server \
/usr/lib/zabbix/alertscripts/zbxTelegram.py 1234567890 test test
Где
1234567890
– ID чата или группы в телеге.
Работает 👍.
Проверка на практике
Если вы подключили локальный zabbix-agent
на шаге начальной настройки, то для проверки просто остановите его командой:
sudo docker compose -f /opt/zabbix/docker-compose.yml stop zabbix-agent
Идем в веб интерфейс по пути: “Мониторинг” – “Проблемы”. Через несколько минут, агент получит статус “Недоступен”, появится проблема на соответствующей веб панели и вам должно прийти уведомление в Telegram.
Сообщение пришло, отлично. Теперь запускаем агента:
sudo docker compose -f /opt/zabbix/docker-compose.yml start zabbix-agent
Через несколько минут он восстановится в веб панели и в телеграм придет соответствующее уведомление:
Прэлэсть 🤤.
Заключение
Фух..🤯 это была не самая простая статья. Особенно по объему перелопаченной информации. Но, мне кажется, оно того стоило. В итоге мы получили гибкий и легко переносимый проект системы мониторинга, работающий внутри docker контейнеров. А также мы настроили лаконичные, но информативные уведомления с графиками в Telegram, чтобы всегда быть в курсе состояния нашей инфраструктуры.
Хочется также отметить великолепную работу разработчиков Zabbix. В частности, актуальность и разнообразие docker образов и доступность файлов их сборки. После написания этой статьи, я их зауважал еще больше 👍.
Спасибо, что читаете 😊. Если возникли вопросы – приглашаю вас в Вороний чат, как вы догадались, в телеге 😅. У нас там дружное сообщество 🚶♀️🐧🚶🐧🚶♂️🐧. И обязательно подписывайтесь на основной телеграм канал: @r4ven_me, чтобы не пропустить публикации новых материалов на сайте.
Желаю успехов и нападающего прода! 😌
Используемые материалы
- Мой репозиторий zabbix сервера | GitHub
- Мой репозиторий zabbix агента | GitHub
- Временной ряд | Википедия
- Zabbix, временные ряды и TimescaleDB | Habr
- Использование TimescaleDB с Zabbix | Zabbix.com (EN)
- Исходные файлы docker, которые я адаптировал | GitHub
- Реестр docker образов TimescaleDB | Dockerhub
- Описание docker образа PostgresSQL | Dockerhub
- Исходные файлы docker образов TimescaleDB | GitHub
- Описание docker образа Zabbix server | Dockerhub
- Описание docker образа Zabbix web | Dockerhub
- Описание docker образа Zabbix agent | Dockerhub
- Исходный Dockerfile для Zabbix server | GitHub
- Исходные файлы Zabbix Notification Telegram | GitHub
- Описание работы скрипта Zabbix Notification Telegram | GitHub
- Инструкция по установке Zabbix Notification Telegram | GitHub
Порекоммендуете какие-нибудь полезные статьи по Zabbix? А то развернуть то это пол дела, а то и меньше, а вот дальше, что с ним делать… Система то довольно комплексная, и тут без поллитра не воткнуть…
Что-то, где объясняется философия, архитектура системы и рекомендации по построению своей системы мониторинга…
Добрый день.
Согласен, система не самая простая. Рекомендую начать изучение с официальной документации, которая к слову, хорошо переведена на русский язык: https://www.zabbix.com/documentation/6.0/ru/manual (в данном случае документация к 6-й версии Zabbix, но тут разница не велика).
Особенно хочу обратить внимание на страницу с определениями: https://www.zabbix.com/documentation/6.0/ru/manual/definitions – по опыту скажу, самое важное уяснить в голове сущности Zabbix, которыми оперирует данная система мониторинга в процессе работы.
Для получения представления – этого более, чем достаточно. Далее ищите примеры настройки, по конкретным задачам, которые интересны вам.
Вот несколько примеров, которыми я недавно занимался:
Вероятно ничего нового для вас не рассказал, но и вся загвоздка тут в том, что рассказывать можно оочень долго. В данном случае я придерживаюсь принципа от “частного к общему”. Т.е. возникла задача настроить мониторинг какого-то сервиса или события – нашел подходящую статью и попробовал настроить аналогично.
Доброго времени суток!
Подскажите, а вы не собирали образ OpenConnect последней версии для архитектуры arm64?
Имею с этим сложности и уже довольно давно долблюсь с этим
Добрый день. Не было такой необходимости.
Возможно изучу вопрос.