Поднимаем мониторинг на базе Icinga2/Web/Director/Grafana за 5 минут
Свое знакомство с мониторингом Icinga2 я начал в 2018-м году, со статей IT-KB, за что им огромная благодарность. Статьи были подробные, под Debian 8. В то время я активно использовал FreeBSD и за несколько дней изучения мне удалось запустить мониторинг в CBSD JAIL. В 2020-м все это было мною опробовано на Debian 10. Естественно с подробным документированием и составлением статей в личной WiKi. Мониторинг интересный, легкий, возможности широкие, мобильный клиент под Android приличный и удобный. Но есть проблема - даже по своим заметкам в WiKi установка в новой локации каждый раз занимает от часа до двух (на данный момент в телефоне уже с 10-к штук инстансов).
Год назад мне все это надоело и я потратил пару дней, чтобы написать ряд Ansible Playbook-ов, которые большую часть шагов сделают автоматически. Подробности ниже.
Что, Где и Зачем будем устанавливать
На текущий момент предлагается все устанавливать на Debian 12 (естественно x64). Нужно от 2 ядер и от 2 Гб ОЗУ (вообще на 4 ядрах и 4 Гб ОЗУ мониторинг способен легко отслеживать статус пары сотен серверов и пары тысяч метрик. При этом за 1 год прирост данных будет в районе 1-2 Гб (база influxdb в основном)). После установки на диске будет около 4,5 Гб занятого пространства. Если мы мониторим скромные объемы (например, 100 серверов и 1000 метрик) - то в первые 5 лет мы вряд ли вылезем за 10-12 Гб по моему личному опыту (суммарный объем корневой FS).
Icinga2 продукт модульный. Что по итогу будет установлено:
Icinga2 - ядро продукта (сам мониторинг)
Icingaweb2 + Apache2 (как WEB-интерфейс)
IcingaDB - новый визуальный WEB-компонент для управления и мониторинга
Icingadb-redis - свой экземпляр Redis для IcingaDB
Icinga-director - WEB-компонент для настройки Icinga (хостов, сервисов, команд и т.д.)
MariaDB SQL - для хранения 4-х мелких баз данных (которые не растут со временем - по сути это настройки Icinga/Web/Director/IcingaDB)
InfluxDB - для хранения метрик (база растет, но медленно - у меня за годы накопления метрик базы не более 2-3 Гб по итогу в данный момент)
Grafana - для отрисовки графиков по данным из InfluxDB и отображения их в IcingaWeb2
Как видите, Icinga2 сложный модульный продукт и первоначальное изучение его с нуля занимает приличное время (включая установку, на которую первый раз приходится тратить многие часы/дни). Данная статья - пример, как поставить все это за 5 минут и не сильно вспотеть при этом )))
Подготовка Debian 12 к установки из Ansible PlayBook-ов
Скачиваем архив с Playbook-ами и доп файлами: ссылка.
Далее всю работу я провожу в каталоге /root (привычка, увы). Листинг команд подготовки:
cd /root/
tar -xpf Icinga2-Ansible-Debian12-09-11-2023.tar
apt update
apt install ansible
ssh-keygen
cd /root/.ssh/
cat id_rsa.pub >> authorized_keys
cp id_rsa /root/IcingaAnsible/
cd /root/IcingaAnsible/
ssh -i id_rsa root@127.0.0.1
Распаковали архив, установили Ansible, подготовили ключи SSH для работы, зашли по SSH для проверки и чтобы обновился файл /root/.ssh/known_hosts.
Пароли
В начале многих Playbook-ов указаны пароли (большая часть от MariaDB - от root, от отдельных юзеров, которые работают с IcingaIDO, IcingaWeb, Director, IcingaDB). Плюс есть один Blowfish HASH от юзера icingaadmin. Для простоты везде я указал пароль: icingapassword.
Чтобы все это перед установкой поменять, выполните команду (grep -R -i "_password:" *) и во всех сценариях замените пароли:
0-icinga.yml: mysql_root_password: icingapassword
0-icinga.yml: icingaweb_password: icingapassword
0-icinga.yml: icingaadmin_password: $2y$10$Vh8cot0heVpwq76N48WiAe3b60N/rNfzFZby.KQF0szzCqRjlOu9K
2-icingaweb-init-configuration.yml: icingaweb_password: icingapassword
2-icingaweb-init-configuration.yml: director_password: icingapassword
2-icingaweb-init-configuration.yml: icingadb_password: icingapassword
3-influx.yml: influx_password: icingapassword
4-director.yml: mysql_root_password: icingapassword
7-icingadb.yml: icingadb_password: icingapassword
Последовательный запуск Playbook-ов
Начинаем запускать последовательно через ansible-playbook 0-icinga.yml (далее 1-icingaweb-modules.yml и т.д.).
Пример успешно отработавших 8 сценариев:
Hidden text
root@icinga9:~/IcingaAnsible# ansible-playbook 0-icinga.yml
PLAY [debian] **********************************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************************
ok: [debian]
TASK [Install Icinga2 Software] ****************************************************************************************************************************************************
changed: [debian]
TASK [Change root password] ********************************************************************************************************************************************************
changed: [debian]
TASK [Create ~/.my.cnf] ************************************************************************************************************************************************************
changed: [debian]
TASK [Insert into ~/.my.cnf] *******************************************************************************************************************************************************
changed: [debian]
TASK [SQL Flush Privileges] ********************************************************************************************************************************************************
changed: [debian]
TASK [Remove test database] ********************************************************************************************************************************************************
ok: [debian]
TASK [Enable ReWrite Apache Module] ************************************************************************************************************************************************
changed: [debian]
TASK [Set date.timezone in PHP configuration] **************************************************************************************************************************************
changed: [debian]
TASK [Enable Icinga2 feature - COMMAND] ********************************************************************************************************************************************
changed: [debian]
TASK [Get random password for IDO module from ido-mysql.conf] **********************************************************************************************************************
changed: [debian -> 127.0.0.1]
TASK [set_fact] ********************************************************************************************************************************************************************
ok: [debian]
TASK [debug] ***********************************************************************************************************************************************************************
ok: [debian] => {
"ido_password": "d6qyFduTCvpi"
}
TASK [Drop IDO Database] ***********************************************************************************************************************************************************
ok: [debian]
TASK [Create Database for IDO Icinga Module] ***************************************************************************************************************************************
changed: [debian]
TASK [Fill icinga2 database from Template] *****************************************************************************************************************************************
changed: [debian]
TASK [Create SQL User icinga2 for Access to IDO Database] **************************************************************************************************************************
changed: [debian]
TASK [Flush privileges in SQL] *****************************************************************************************************************************************************
changed: [debian]
TASK [Enable Icinga2 feature - IDO-MYSQL] ******************************************************************************************************************************************
changed: [debian]
TASK [Restart Icinga2 Service] *****************************************************************************************************************************************************
changed: [debian]
TASK [Drop Icingaweb2 Database] ****************************************************************************************************************************************************
ok: [debian]
TASK [Create Database for Icingaweb2 Module] ***************************************************************************************************************************************
changed: [debian]
TASK [Create SQL Database for Icingaweb2] ******************************************************************************************************************************************
changed: [debian]
TASK [Grant Access for Database for Icingaweb2] ************************************************************************************************************************************
changed: [debian]
TASK [Create Icingaweb2 User in Database] ******************************************************************************************************************************************
changed: [debian]
TASK [Flush privileges in SQL] *****************************************************************************************************************************************************
changed: [debian]
TASK [Restart Apache2 Service] *****************************************************************************************************************************************************
changed: [debian]
PLAY RECAP *************************************************************************************************************************************************************************
debian : ok=27 changed=21 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
root@icinga9:~/IcingaAnsible# ansible-playbook 1-icingaweb-modules.yml
PLAY [debian] **********************************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************************
ok: [debian]
TASK [Install Grafana module for Icingaweb2] ***************************************************************************************************************************************
changed: [debian]
TASK [Install IPL module for Icingaweb2] *******************************************************************************************************************************************
changed: [debian]
TASK [Install Incubator module for Icingaweb2] *************************************************************************************************************************************
changed: [debian]
TASK [Install Reactbundle module for Icingaweb2] ***********************************************************************************************************************************
changed: [debian]
TASK [Install Director module for Icingaweb2] **************************************************************************************************************************************
changed: [debian]
TASK [Enable Monitoring Module in Icingaweb2] **************************************************************************************************************************************
changed: [debian]
PLAY RECAP *************************************************************************************************************************************************************************
debian : ok=7 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
root@icinga9:~/IcingaAnsible# ansible-playbook 2-icingaweb-init-configuration.yml
PLAY [debian] **********************************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************************
ok: [debian]
TASK [Install authentication.ini] **************************************************************************************************************************************************
changed: [debian]
TASK [Install config.ini] **********************************************************************************************************************************************************
changed: [debian]
TASK [Install groups.ini] **********************************************************************************************************************************************************
changed: [debian]
TASK [Get random password for IDO module from ido-mysql.conf] **********************************************************************************************************************
changed: [debian -> 127.0.0.1]
TASK [set_fact] ********************************************************************************************************************************************************************
ok: [debian]
TASK [debug] ***********************************************************************************************************************************************************************
ok: [debian] => {
"ido_password": "d6qyFduTCvpi"
}
TASK [Install resources.ini] *******************************************************************************************************************************************************
changed: [debian]
TASK [Install roles.ini] ***********************************************************************************************************************************************************
changed: [debian]
TASK [Create monitoring cfg folder] ************************************************************************************************************************************************
changed: [debian]
TASK [Enable API Function in Icinga2] **********************************************************************************************************************************************
changed: [debian]
TASK [Get random password for API Icinga2 after api setup] *************************************************************************************************************************
changed: [debian -> 127.0.0.1]
TASK [set_fact] ********************************************************************************************************************************************************************
ok: [debian]
TASK [debug] ***********************************************************************************************************************************************************************
ok: [debian] => {
"api_password": "cd53fe09a2bca6d7"
}
TASK [Create backends.ini for module monitoring] ***********************************************************************************************************************************
changed: [debian]
TASK [Create commandtransports.ini for module monitoring] **************************************************************************************************************************
changed: [debian]
TASK [Create config.ini for module monitoring] *************************************************************************************************************************************
changed: [debian]
PLAY RECAP *************************************************************************************************************************************************************************
debian : ok=17 changed=12 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
root@icinga9:~/IcingaAnsible# ansible-playbook 3-influx.yml
PLAY [debian] **********************************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************************
ok: [debian]
TASK [Install InfluxDB Software] ***************************************************************************************************************************************************
changed: [debian]
TASK [Create InfluxDB Database for Icinga Metrics] *********************************************************************************************************************************
changed: [debian]
TASK [Create InfluxDB User] ********************************************************************************************************************************************************
changed: [debian]
TASK [Grant Access for User to Database] *******************************************************************************************************************************************
changed: [debian]
TASK [Enable InfluxDB Module in Icinga Service] ************************************************************************************************************************************
changed: [debian]
TASK [Enable InfluxDB in Icinga] ***************************************************************************************************************************************************
changed: [debian]
TASK [Restart Icinga Service] ******************************************************************************************************************************************************
changed: [debian]
PLAY RECAP *************************************************************************************************************************************************************************
debian : ok=8 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
root@icinga9:~/IcingaAnsible# ansible-playbook 4-director.yml
PLAY [debian] **********************************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************************
ok: [debian]
TASK [Remove director database if exists] ******************************************************************************************************************************************
ok: [debian]
TASK [Create database for Director Icingaweb Module] *******************************************************************************************************************************
changed: [debian]
TASK [Create user for Director Access] *********************************************************************************************************************************************
changed: [debian]
TASK [Grant access user for director database] *************************************************************************************************************************************
changed: [debian]
PLAY RECAP *************************************************************************************************************************************************************************
debian : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
root@icinga9:~/IcingaAnsible# ansible-playbook 5-director-kickstart.yml
PLAY [debian] **********************************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************************
ok: [debian]
TASK [Get random password for API Icinga2 after api setup] *************************************************************************************************************************
changed: [debian -> 127.0.0.1]
TASK [set_fact] ********************************************************************************************************************************************************************
ok: [debian]
TASK [debug] ***********************************************************************************************************************************************************************
ok: [debian] => {
"api_password": "cd53fe09a2bca6d7"
}
TASK [Get Icinga hostname] *********************************************************************************************************************************************************
changed: [debian -> 127.0.0.1]
TASK [set_fact] ********************************************************************************************************************************************************************
ok: [debian]
TASK [debug] ***********************************************************************************************************************************************************************
ok: [debian] => {
"icinga_hostname": "icinga9.test.local"
}
TASK [Create director kickstart cfg folder] ****************************************************************************************************************************************
changed: [debian]
TASK [Create config.ini to set director database name] *****************************************************************************************************************************
changed: [debian]
TASK [Create kickstart.ini for configure director] *********************************************************************************************************************************
changed: [debian]
TASK [Populate Director Database] **************************************************************************************************************************************************
changed: [debian]
TASK [Kickstat Director] ***********************************************************************************************************************************************************
changed: [debian]
PLAY RECAP *************************************************************************************************************************************************************************
debian : ok=12 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
root@icinga9:~/IcingaAnsible# ansible-playbook 6-grafana-dpkg-install.yml
PLAY [debian] **********************************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************************
ok: [debian]
TASK [Install grafana dependencies] ************************************************************************************************************************************************
changed: [debian]
TASK [Download Grafana Debian Package from Custom URL Source] **********************************************************************************************************************
changed: [debian]
TASK [Install Grafana Server] ******************************************************************************************************************************************************
changed: [debian]
TASK [Reload systemctl Daemons Lists] **********************************************************************************************************************************************
changed: [debian]
TASK [Enable Grafana Service] ******************************************************************************************************************************************************
changed: [debian]
TASK [Set allow_embedding in grafana.ini] ******************************************************************************************************************************************
changed: [debian]
TASK [Enable anonymous access] *****************************************************************************************************************************************************
changed: [debian]
TASK [Enable anonymous name] *******************************************************************************************************************************************************
changed: [debian]
TASK [Enable anonymous role] *******************************************************************************************************************************************************
changed: [debian]
TASK [Start Grafana Server] ********************************************************************************************************************************************************
changed: [debian]
TASK [Install Grafana plugin - grafana-image-renderer] *****************************************************************************************************************************
changed: [debian]
TASK [Final change all permission on Icingaweb2 folder] ****************************************************************************************************************************
changed: [debian]
TASK [Restart Grafana Service] *****************************************************************************************************************************************************
changed: [debian]
PLAY RECAP *************************************************************************************************************************************************************************
debian : ok=14 changed=13 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
root@icinga9:~/IcingaAnsible# ansible-playbook 7-icingadb.yml
PLAY [debian] **********************************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************************
ok: [debian]
TASK [Add IcingaDB Repository] *****************************************************************************************************************************************************
changed: [debian]
TASK [Add APT Key from Icinga Repository] ******************************************************************************************************************************************
changed: [debian]
TASK [Install IcingaDB and other services] *****************************************************************************************************************************************
changed: [debian]
TASK [Drop IDO Database] ***********************************************************************************************************************************************************
ok: [debian]
TASK [Drop user] *******************************************************************************************************************************************************************
ok: [debian]
TASK [FLUSH PRIVIGELES] ************************************************************************************************************************************************************
changed: [debian]
TASK [Create icingadb database] ****************************************************************************************************************************************************
changed: [debian]
TASK [Create user icingadb] ********************************************************************************************************************************************************
changed: [debian]
TASK [Create icingadb database] ****************************************************************************************************************************************************
changed: [debian]
TASK [Fill SQL Database for IcingaDB] **********************************************************************************************************************************************
changed: [debian]
TASK [Set password for icingadb cfg] ***********************************************************************************************************************************************
changed: [debian]
TASK [Enable icingadb feature] *****************************************************************************************************************************************************
changed: [debian]
TASK [Restart Icinga2 Service] *****************************************************************************************************************************************************
changed: [debian]
TASK [Create icingadb modules folder] **********************************************************************************************************************************************
changed: [debian]
TASK [Create config.ini for module icingadb] ***************************************************************************************************************************************
changed: [debian]
TASK [Create redis.ini for module icingadb] ****************************************************************************************************************************************
changed: [debian]
TASK [Enable Icingaweb2 module IcingaDB] *******************************************************************************************************************************************
changed: [debian]
TASK [Restart IcingaDB Service] ****************************************************************************************************************************************************
changed: [debian]
PLAY RECAP *************************************************************************************************************************************************************************
debian : ok=19 changed=16 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Донастройка интеграции с Grafana
Увы, не удалось на текущий момент на 100% сделать все автоматически (хотя пытался). Осталось сделать несколько простых шагов:
Подключиться к Grafana на наш сервер (виртуалку) на порт 3000, логин-пароль admin/admin
Добавить источник данных для Grafana (InfluxDB) в разделе Configuration -> Data Sources -> Add -> InfluxDB - данные ниже:
URL: http://localhost:8086
Database: icinga2
User: icinga2
Password: icingapassword
Зайти в раздел Dashboard -> Import и импортировать готовый Dashboard по ссылке. При импорте указать наш InfluxDB как источник данных.
После того, как импорт успешно произойдет, он сразу в Grafana откроется. Нам нужно из URL строки вычленить и скопировать себе уникальный ID для данного Dashboard-а (см. пример на картинке)
В данном примере у нас получилось: 3azngr4Iz. Но у Вас 100% будет он другой в Вашей инсталляции. Этот ID нам понадобится для Icingaweb2 для настройки модуля интеграции с Grafana.
Донастройка WEB-интерфейса и его проверка
Входим на наш сервер по адресу: http://X.X.X.X/icingaweb2/. Login: icingaadmin, пароль либо icingapassword (можно после входа его сразу сменить. Либо сгенерировать Blowfish хэш и его подставить в переменную icingaadmin_password).
Первым делом стоит применить изменения от модуля Director к текущей конфигурации (идет в раздел Icinga Director -> Activity Log -> Deploy 253 pending changes).
Теперь ищем слева в самом низу шестеренку, выбираем пункт Modules. Видим, что модуль для работы с Grafana не активен. Жмем его, в правом верхнем разделе(фрейме) рядом с словом Disable жмем на переключатель. И после того, как модуль будет включен (а это по сути просто создание символической ссылки в каталоге /etc/icingaweb2/enabledModules/), переходим в раздел Configuration (он начнет отображаться после включения модуля).
Настраиваем поля, отмеченные на скриншоте:
Сохраняем, проверяем. Переходим в раздел: Icinga DB (левый фрейм), выбираем раздел Services, выбираем какой нибудь сервис (например, procs - количество запущенных процессов). Видим примерно тоже самое, что и на скриншоте:
Ну вот и все - установка завершена. Теперь остается изучать, читать и наполнять Icinga2 через модуль Icinga Director объектами мониторинга (командами, службами, хостами и т.д.). Понятно, что это большая и основная часть работы - ее в статье так просто не опишешь.
Итоги
Всем спасибо за внимание и надеюсь, что моя работа сподвигнет Вас потратить 10-15 минут своего времени на прочтение и тестовую установку этого замечательного (по моему мнению конечно) продукта. Успехов!
Обновление - от 01-07-2024
В блоге blog.it-kb.ru появились свежие статьи по установке Icinga2 на Debian 12. Ссылки на части: раз, два, три, четыре, пять и шесть. Респект и уважуха!
Обновление - от 05-07-2024
С учетом информации из blog.it-kb.ru обновил свои Ansible Playbook-и: ссылка
Улучшения:
Изменена логика установки компонентов IcingaDB/Redis/Web
Многие действия в MySQL теперь выполняются без command
Убраны лишние скрипты, устанавливающие разные модули Director
Добавлен фикс новой баги в Grafana модуле для Icingaweb
ВАЖНО:
Перед запуском плейбуков установите статический IP, FQDN DNS имя и соответствие IP и имени в /etc/hosts. Перезагрузите сервер
Выбранное FQDN имя выставите в первом по списку Playbook (0-icinga.yml) в переменной myhostname
nano /etc/network/interfaces
hostnamectl set-hostname icinga.test.local
nano /etc/hosts
reboot
nano /root/IcingaAnsible/0-icinga.yml