Icinga 2: распределённый мониторинг корпоративной сети

Архитектура распределённого мониторинга Icinga 2

Icinga 2 — мощная open-source система мониторинга, форк Nagios с полностью переписанным ядром на C++. Главное преимущество Icinga 2 — нативная поддержка распределённой архитектуры с зонами, сателлитами и агентами, связанными по защищённому TLS-каналу.

Распределённая модель Icinga 2 строится на трёх ролях:

  • Master — центральный узел, хранит конфигурацию, принимает результаты проверок, запускает уведомления. Здесь же работают Icinga Web 2, IDO (база данных), API
  • Satellite — промежуточный узел в удалённом филиале/ЦОД. Выполняет проверки локально, передаёт результаты на Master. Может работать автономно при разрыве связи с мастером
  • Agent — устанавливается на каждый контролируемый хост. Выполняет локальные проверки (CPU, RAM, диски, сервисы) и отправляет результаты сателлиту или напрямую мастеру

Связь между узлами осуществляется по протоколу Icinga 2 Cluster (TCP 5665) с двусторонней TLS-аутентификацией. Каждый узел имеет собственный сертификат, подписанный CA мастера.

Зоны и эндпоинты

Зона (zone) — логическая группа узлов, между которыми синхронизируется конфигурация и результаты. Эндпоинт (endpoint) — конкретный узел Icinga 2 внутри зоны.

// Пример: Master в Москве, Satellite в Петербурге, агенты
// zones.conf на Master:

object Zone "master" {
  endpoints = [ "icinga-master.msk.local" ]
}

object Zone "satellite-spb" {
  parent = "master"
  endpoints = [ "icinga-sat.spb.local" ]
}

object Zone "global-templates" {
  global = true  // Синхронизируется на все узлы
}

object Endpoint "icinga-master.msk.local" {
  host = "10.0.1.10"
}

object Endpoint "icinga-sat.spb.local" {
  host = "10.1.1.10"
}

Установка Icinga 2 Master

Установка на Ubuntu 22.04/24.04 с базой данных PostgreSQL и веб-интерфейсом:

# Подключение репозитория Icinga
apt install -y apt-transport-https gnupg
curl -fsSL https://packages.icinga.com/icinga.key | gpg --dearmor -o /usr/share/keyrings/icinga.gpg
echo "deb [signed-by=/usr/share/keyrings/icinga.gpg] https://packages.icinga.com/ubuntu icinga-$(lsb_release -cs) main" > /etc/apt/sources.list.d/icinga.list
apt update

# Установка Icinga 2 и IDO PostgreSQL
apt install -y icinga2 icinga2-ido-pgsql monitoring-plugins

# Включение модулей
icinga2 feature enable ido-pgsql api command

# Инициализация мастера
icinga2 node wizard
# Выбрать: master
# CN: icinga-master.msk.local
# Зона: master

Настройка базы данных IDO:

# PostgreSQL
sudo -u postgres psql
CREATE USER icinga2 WITH PASSWORD 'StrongIDOPass';
CREATE DATABASE icinga2 OWNER icinga2;
\q

# Импорт схемы
PGPASSWORD=StrongIDOPass psql -U icinga2 -d icinga2 < /usr/share/icinga2-ido-pgsql/schema/pgsql.sql

# /etc/icinga2/features-available/ido-pgsql.conf
object IdoMysqlConnection "ido-pgsql" {
  user = "icinga2"
  password = "StrongIDOPass"
  host = "localhost"
  database = "icinga2"
}

Установка Icinga Web 2

Веб-интерфейс для визуализации и управления:

# Установка
apt install -y icingaweb2 icingacli php-pgsql php-intl php-imagick

# Создание БД для Icinga Web 2
sudo -u postgres psql
CREATE USER icingaweb2 WITH PASSWORD 'WebDBPass';
CREATE DATABASE icingaweb2 OWNER icingaweb2;
\q

# Импорт схемы
PGPASSWORD=WebDBPass psql -U icingaweb2 -d icingaweb2 < /usr/share/icingaweb2/schema/pgsql.schema.sql

# Генерация токена для веб-установки
icingacli setup token create
# Откройте http://icinga-master:80/icingaweb2/setup
# Введите токен и следуйте мастеру настройки

systemctl restart icinga2 apache2

Настройка Satellite в удалённом филиале

На сателлите устанавливается полноценный Icinga 2, но в роли подчинённого узла:

# На satellite (10.1.1.10):
apt install -y icinga2 monitoring-plugins

# Запуск визарда в режиме satellite
icinga2 node wizard
# Выбрать: satellite/client
# CN: icinga-sat.spb.local
# Master CN: icinga-master.msk.local
# Master host: 10.0.1.10
# Master port: 5665
# Принять сертификат: yes
# Зона: satellite-spb
# Parent zone: master

На мастере подтвердите запрос сертификата:

# На Master — список ожидающих подписи
icinga2 ca list

# Подписать сертификат сателлита
icinga2 ca sign <fingerprint>

# Или автоматическая подпись (удобно для массового деплоя)
icinga2 ca sign --all

После подписи сертификата связь между мастером и сателлитом устанавливается автоматически. Проверка:

# На Master — статус кластера
icinga2 daemon -C  # Проверка конфигурации
curl -k -s -u root:icinga https://localhost:5665/v1/status/CIB | python3 -m json.tool

Автономная работа сателлита

Ключевое преимущество сателлитов — способность работать автономно при потере связи с мастером. Результаты проверок буферизуются и передаются при восстановлении канала:

// /etc/icinga2/zones.conf на Satellite
// Параметры буферизации
object Endpoint "icinga-master.msk.local" {
  host = "10.0.1.10"
  port = 5665
  log_duration = 86400  // Хранить буфер 24 часа
}

// На сателлите можно определить локальные проверки,
// которые выполняются независимо от мастера:
object Zone "satellite-spb" {
  parent = "master"
  endpoints = [ "icinga-sat.spb.local" ]
}

Развёртывание агентов на хостах

Агент Icinga 2 устанавливается на каждый контролируемый сервер для выполнения локальных проверок. Для массового развёртывания используйте скрипт:

#!/bin/bash
# deploy_icinga_agent.sh — запускать на целевом хосте
set -e

MASTER_HOST="10.0.1.10"
MASTER_CN="icinga-master.msk.local"
ZONE_NAME=$(hostname -f)
TICKET=$(curl -k -s -u root:icinga \
  "https://${MASTER_HOST}:5665/v1/actions/generate-ticket" \
  -d "{\"cn\": \"${ZONE_NAME}\"}" \
  -H 'Content-Type: application/json' | python3 -c 'import sys,json;print(json.load(sys.stdin)["results"][0]["ticket"])')

apt install -y icinga2 monitoring-plugins

# Автоматическая настройка агента с ticket-based PKI
icinga2 node setup \
  --ticket "$TICKET" \
  --cn "$ZONE_NAME" \
  --endpoint "$MASTER_CN,$MASTER_HOST,5665" \
  --zone "$ZONE_NAME" \
  --parent_zone "master" \
  --trustedcert /var/lib/icinga2/certs/trusted-master.crt \
  --accept-config --accept-commands

systemctl enable --now icinga2

Top-down конфигурация хостов

Конфигурация агентов определяется централизованно на мастере и автоматически синхронизируется:

// /etc/icinga2/zones.d/master/hosts.conf на Master

object Host "web-server-01" {
  check_command = "hostalive"
  address = "10.0.2.10"
  
  vars.os = "linux"
  vars.disks["disk /"] = { disk_partitions = "/" }
  vars.disks["disk /var"] = { disk_partitions = "/var" }
}

object Endpoint "web-server-01" {
  host = "10.0.2.10"
}

object Zone "web-server-01" {
  parent = "master"
  endpoints = [ "web-server-01" ]
}

// Применение шаблона сервисов
apply Service "disk" for (disk => config in host.vars.disks) {
  check_command = "disk"
  command_endpoint = host.name  // Выполнять на агенте!
  
  vars += config
  assign where host.vars.os == "linux"
}

Icinga Director для управления конфигурацией

Icinga Director — веб-модуль для управления конфигурацией через GUI вместо редактирования текстовых файлов. Незаменим при сотнях хостов:

# Установка Director
apt install -y icingaweb2-module-director

# Создание БД Director
sudo -u postgres psql
CREATE DATABASE director OWNER icingaweb2;
\q

# Миграция схемы
icingacli module enable director
icingacli director migration run

# Настройка API endpoint для Director
# /etc/icinga2/conf.d/api-users.conf
object ApiUser "director" {
  password = "DirectorApiPass"
  permissions = [ "*" ]
}

Director предоставляет: импорт хостов из CSV/LDAP/AWS/VMware, шаблоны хостов и сервисов через GUI, визуальный редактор проверок и уведомлений, деплой конфигурации в один клик с предварительным review.

Автоматическая регистрация агентов через Director

Director поддерживает Self-Service API — агенты регистрируются автоматически при первом запуске:

# 1. В Director создайте Host Template с переменной:
# vars.agent_registration_token = "unique-token-per-template"

# 2. На агенте при установке укажите Self-Service API:
icinga2 node setup \
  --cn $(hostname -f) \
  --zone $(hostname -f) \
  --parent_zone master \
  --endpoint icinga-master.msk.local,10.0.1.10,5665 \
  --trustedcert /tmp/trusted-master.crt \
  --accept-config --accept-commands

# 3. Регистрация в Director через API:
curl -k -s -X POST \
  "https://icinga-master:443/icingaweb2/director/self-service/register-host" \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "'$(hostname -f)'",
    "template": "linux-server",
    "address": "'$(hostname -I | awk "{print \$1}")'"
  }'

Настройка уведомлений и эскалаций

Icinga 2 поддерживает гибкую систему уведомлений с эскалациями, расписаниями и фильтрацией:

// /etc/icinga2/zones.d/master/notifications.conf

// Email уведомления
object NotificationCommand "mail-host-notification" {
  command = [ SysconfDir + "/icinga2/scripts/mail-host-notification.sh" ]
  env = {
    NOTIFICATIONTYPE = "$notification.type$"
    HOSTALIAS = "$host.display_name$"
    HOSTADDRESS = "$address$"
    HOSTSTATE = "$host.state$"
    HOSTOUTPUT = "$host.output$"
    USEREMAIL = "$user.email$"
  }
}

// Telegram уведомления
object NotificationCommand "telegram-notification" {
  command = [ "/usr/local/bin/icinga2-telegram.sh" ]
  env = {
    TG_BOT_TOKEN = "123456:ABC..."
    TG_CHAT_ID = "-100123456789"
    NOTIFICATION_TYPE = "$notification.type$"
    HOST_NAME = "$host.name$"
    SERVICE_NAME = "$service.name$"
    SERVICE_STATE = "$service.state$"
    SERVICE_OUTPUT = "$service.output$"
  }
}

// Применение уведомлений
apply Notification "telegram-admins" to Service {
  command = "telegram-notification"
  users = [ "admin-team" ]
  
  // Только критические состояния
  states = [ Critical, Unknown ]
  types = [ Problem, Recovery ]
  
  // Эскалация: повторять каждые 30 мин
  interval = 30m
  
  assign where service.vars.priority == "high"
}

Мониторинг производительности и Dashboard

Для графиков производительности Icinga 2 интегрируется с InfluxDB/Graphite через PerfData writer:

# Включение InfluxDB writer
icinga2 feature enable influxdb

# /etc/icinga2/features-available/influxdb.conf
object InfluxdbWriter "influxdb" {
  host = "localhost"
  port = 8086
  database = "icinga2"
  username = "icinga2"
  password = "InfluxPass"
  
  host_template = {
    measurement = "$host.check_command$"
    tags = {
      hostname = "$host.name$"
    }
  }
  service_template = {
    measurement = "$service.check_command$"
    tags = {
      hostname = "$host.name$"
      service = "$service.name$"
    }
  }
  
  flush_interval = 10s
  flush_threshold = 1024
}

systemctl restart icinga2

Для визуализации графиков в Icinga Web 2 установите модуль Grafana:

apt install -y icingaweb2-module-grafana
icingacli module enable grafana

# Настройка в Icinga Web 2 → Configuration → Modules → Grafana:
# Host: http://grafana.local:3000
# Default dashboard: icinga2-default
# Datasource: icinga2-influxdb

Часто задаваемые вопросы

Icinga 2 — конфигурация через текстовые файлы (DSL) с поддержкой Git/CI-CD, нативная распределённая архитектура, совместимость с плагинами Nagios. Zabbix — конфигурация через GUI, встроенные графики и отчёты, проще для небольших команд. Icinga 2 предпочтительна для DevOps-команд, привыкших к Infrastructure as Code. Zabbix — для классических IT-отделов с GUI-ориентированным workflow.

Один мастер Icinga 2 на сервере с 8 ядрами и 16 ГБ RAM обрабатывает 5000-10000 хостов и 50000-100000 сервисных проверок с интервалом 60 секунд. При использовании сателлитов — значительно больше, так как нагрузка распределяется. Узкое место обычно — база данных IDO, поэтому для крупных инсталляций используйте PostgreSQL на отдельном сервере с SSD.

Icinga 2 включает утилиту миграции: icinga2 migrate-config /etc/nagios/nagios.cfg. Она конвертирует объекты Nagios в формат Icinga 2 DSL. Плагины Nagios совместимы без изменений — достаточно указать путь в PluginDir. Однако для распределённой архитектуры (зоны, сателлиты) потребуется ручная доработка — в Nagios нет аналога.

Нет, агент необязателен. Icinga 2 поддерживает agentless-проверки: SSH-based (через by_ssh плагин), SNMP, HTTP/API, WMI для Windows. Однако агент даёт преимущества: более точные данные (локальный замер CPU/RAM вместо удалённого), буферизацию при потере сети, выполнение скриптов от локального пользователя. Рекомендуется ставить агент на критичные серверы и использовать agentless для второстепенных устройств.

Icinga 2 поддерживает Active/Active HA: два мастера в одной зоне, оба принимают результаты и выполняют проверки. Настройка: в zones.conf укажите два endpoint в зоне master, на каждом мастере выполните icinga2 node wizard с указанием второго мастера как peer. IDO базу данных разместите на отдельном сервере PostgreSQL с репликацией. Для Icinga Web 2 используйте балансировщик перед двумя инстансами.

Нужна помощь с настройкой?

Специалисты АйТи Фреш помогут с внедрением и настройкой — 15+ лет опыта, обслуживание от 15 000 ₽/мес

📞 Связаться с нами
#Icinga 2#распределённый мониторинг#Icinga Web 2#icinga2 настройка#мониторинг сети#icinga2 agent#icinga2 зоны#мониторинг серверов
Комментарии 0

Оставить комментарий

загрузка...