Свое знакомство с мониторингом 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 минут своего времени на прочтение и тестовую установку этого замечательного (по моему мнению конечно) продукта. Успехов!
olegtsss
Чем представленное решение лучше Zabbix?
Dorlas Автор
Чтобы ответить, нужно хорошо знать Zabbix и работать с ним несколько лет (бекапить его, переносить данные между серверами и т.д.). У меня такого опыт нет, поэтому ответить я не смогу.
olegtsss
Zabbix работает хорошо. В качестве клиентов оптимально использовать либо zabbix-агенты (которые есть для windows и linux) или snmp (который может быть даже в кофеварке). Ну и всякие разные другие навороты.
Dorlas Автор
Ровно тоже самое могу сказать и про Icinga. Агенты, SNMP, сети, свои скрипты, скрипты с Nagios Exchange (там их сотни). Каждому свое, OpenSource дает выбор - выбирайте и пользуйтесь ) логично же.
НО - все это нас ни разу не приближает к ответу - Чем лучше )
olegtsss
Поэтому и интересно.
Dorlas Автор
Тогда ждем в камментах человека, с опытом использования обоих систем (практического сравнения конечно же). Просто по фичам они сильно похожи.
olegtsss
В этом сила площадки, в комментариях люди делятся настоящим опытом, часто отсекая рекламную мишуру.
Dorlas Автор
Согласен - я часто в комментариях находил очень интересные советы, ссылки на продукты. Бывает и лично человеку напишешь, поделится опытом. Хабру респект и уважуха!
dsh2dsh
Для меня, в основном в том, что конфиги в нормальных текстовых файлах и я могу их нормально редактировать в любимом редакторе и хранить в git. Следующая причина - развитый язык шаблонов, избавляющий меня от написания множества однотипных правил. Следующая причина - наличие зависимостей. Т.е. мне достаточно написать, что сервис А зависит от сервиса Б и все остальное будет автоматически. Т.е. мне не нужно руками описывать для каждого сервиса, что не посылать мне уведомления, если не работает сервис Б, а так же сервис Ц, от которого зависит Б, а так же ещё каких-нибудь 2 других сервиса и т.д. Задолбался я в zabbix возить мышкой, настраивая вот это всё.
Dorlas Автор
Спасибо, любопытная информация! Я то по старинке делаю, руками и мышкой )))
А насчет архитектуры, объема баз данных, скорости работы PostgreSQL есть чем поделиться ?
olegtsss
Zabbix подходит для прода - стабильно работает годами и не падает. А как с этим у Icinga?
Dorlas Автор
За 5 лет у меня проблем не было с демоном (ядром) никаких. Агенты ранних версий иногда падали (но редко).
dsh2dsh
Собственно, а как там может быть? Наследник Nagios с многолетней историей. Что там может быть иного, кроме того же самого работает годами и не падает.
dsh2dsh
Вопрос не понял. Архитектура чего, объём каких баз и при чём тут скорость работы postgresql?
Сразу предупрежу - у меня сеть не большая. Пяток серверов и железок разных, да сотня сервисов.