Свое знакомство с мониторингом 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 - количество запущенных процессов). Видим примерно тоже самое, что и на скриншоте:

Финальный вид - работа Grafana в связке с IcingaWeb2
Финальный вид - работа Grafana в связке с IcingaWeb2

Ну вот и все - установка завершена. Теперь остается изучать, читать и наполнять Icinga2 через модуль Icinga Director объектами мониторинга (командами, службами, хостами и т.д.). Понятно, что это большая и основная часть работы - ее в статье так просто не опишешь.

Итоги

Всем спасибо за внимание и надеюсь, что моя работа сподвигнет Вас потратить 10-15 минут своего времени на прочтение и тестовую установку этого замечательного (по моему мнению конечно) продукта. Успехов!

Комментарии (14)


  1. olegtsss
    09.11.2023 08:02

    Чем представленное решение лучше Zabbix?


    1. Dorlas Автор
      09.11.2023 08:02

      Чтобы ответить, нужно хорошо знать Zabbix и работать с ним несколько лет (бекапить его, переносить данные между серверами и т.д.). У меня такого опыт нет, поэтому ответить я не смогу.


      1. olegtsss
        09.11.2023 08:02

        Zabbix работает хорошо. В качестве клиентов оптимально использовать либо zabbix-агенты (которые есть для windows и linux) или snmp (который может быть даже в кофеварке). Ну и всякие разные другие навороты.


        1. Dorlas Автор
          09.11.2023 08:02

          Ровно тоже самое могу сказать и про Icinga. Агенты, SNMP, сети, свои скрипты, скрипты с Nagios Exchange (там их сотни). Каждому свое, OpenSource дает выбор - выбирайте и пользуйтесь ) логично же.

          НО - все это нас ни разу не приближает к ответу - Чем лучше )


          1. olegtsss
            09.11.2023 08:02

            Поэтому и интересно.


            1. Dorlas Автор
              09.11.2023 08:02

              Тогда ждем в камментах человека, с опытом использования обоих систем (практического сравнения конечно же). Просто по фичам они сильно похожи.


              1. olegtsss
                09.11.2023 08:02
                +1

                В этом сила площадки, в комментариях люди делятся настоящим опытом, часто отсекая рекламную мишуру.


                1. Dorlas Автор
                  09.11.2023 08:02

                  Согласен - я часто в комментариях находил очень интересные советы, ссылки на продукты. Бывает и лично человеку напишешь, поделится опытом. Хабру респект и уважуха!


    1. dsh2dsh
      09.11.2023 08:02
      +1

      Для меня, в основном в том, что конфиги в нормальных текстовых файлах и я могу их нормально редактировать в любимом редакторе и хранить в git. Следующая причина - развитый язык шаблонов, избавляющий меня от написания множества однотипных правил. Следующая причина - наличие зависимостей. Т.е. мне достаточно написать, что сервис А зависит от сервиса Б и все остальное будет автоматически. Т.е. мне не нужно руками описывать для каждого сервиса, что не посылать мне уведомления, если не работает сервис Б, а так же сервис Ц, от которого зависит Б, а так же ещё каких-нибудь 2 других сервиса и т.д. Задолбался я в zabbix возить мышкой, настраивая вот это всё.


      1. Dorlas Автор
        09.11.2023 08:02

        Спасибо, любопытная информация! Я то по старинке делаю, руками и мышкой )))
        А насчет архитектуры, объема баз данных, скорости работы PostgreSQL есть чем поделиться ?


        1. olegtsss
          09.11.2023 08:02

          Zabbix подходит для прода - стабильно работает годами и не падает. А как с этим у Icinga?


          1. Dorlas Автор
            09.11.2023 08:02

            За 5 лет у меня проблем не было с демоном (ядром) никаких. Агенты ранних версий иногда падали (но редко).


          1. dsh2dsh
            09.11.2023 08:02
            +1

            А как с этим у Icinga?

            Собственно, а как там может быть? Наследник Nagios с многолетней историей. Что там может быть иного, кроме того же самого работает годами и не падает.


        1. dsh2dsh
          09.11.2023 08:02

          А насчет архитектуры, объема баз данных, скорости работы PostgreSQL есть чем поделиться ?

          Вопрос не понял. Архитектура чего, объём каких баз и при чём тут скорость работы postgresql?

          Сразу предупрежу - у меня сеть не большая. Пяток серверов и железок разных, да сотня сервисов.