Icinga2 как проверить, слушает ли порт?

Вопрос или проблема

Я просто хочу выполнить запрос к хосту в Icinga2 и проверить, отвечает ли порт. После дней прочтения документации я все еще ужасно запутан. Вот что я придумал изначально:

object CheckCommand "check_tcp_webproxy" {
    command = "check_network_port -H $HOSTNAME$ -p 3128"
}

object Host "webproxyprodapp01" {
    check_commands = [
        "check_tcp_webproxy"  
    ]
    address = "x.x.x.x"
}

Но это просто выдает ошибки на “check_commands”.

Поэтому я попробовал это в качестве сервиса:

object Service "webproxy_ports" {
    check_command = "tcp" 
    host = "webprxprdapp01"
    check_interval = 1m
    vars.tcp_ports = [3128]
    display_name = "Webproxy ports 3128"
    apply Service {
        for (port in vars.tcp_ports) {
            check_command = "tcp" 
            -p "$port"
        }
    }
}

Который также выдает ошибки, которые я даже не могу загуглить.

Может ли кто-то опубликовать простой способ определения хоста и способ проверки, открыт ли порт 3128 на нем?

Ответ или решение

Чтобы настроить проверку порта на сервере с использованием Icinga2, необходимо следовать определённой процедуре настройки объектов и команд. Ваше задание создать рабочую конфигурацию для проверки доступности порта 3128 на хосте. Рассмотрим, как правильно это сделать шаг за шагом и разберем проблемы, встреченные в вашем коде.

Теория

Для выполнения требуемой проверки используем стандартную команду tcp из пакета monitoring-plugins. Данная команда позволяет проверить доступность указанного порта на хосте. Конфигурация в Icinga2 делится на несколько сущностей: Host, Service, и CheckCommand. Host отвечает за конфигурацию машин, которые мониторим, Service – за проверки на этих машинах. CheckCommand – за конкретные команды проверки, которые можно применять к сервисам.

Пример

Начнем с исправления вашей конфигурации.

  1. Определение CheckCommand. Обычно, стандартная команда TCP устанавливается сразу, и она уже встроена в систему. Однако, чтобы убедиться, что всё сконфигурировано корректно, можно явно указать эту команду. Если check_network_port – это ваша пользовательская команда, необходимо определить её корректно, однако кажется, что вы предполагали использовать уже существующую команду tcp.
object CheckCommand "tcp" {
    import "plugin-check-command"
    command = [ PluginDir + "/check_tcp" ]

    arguments = {
        "-H" = "$host.address$"
        "-p" = {
            value = "$tcp_port$"
            description = "Port to check"
        }
    }
}
  1. Определение хоста. Здесь просто задаем IP-адрес или DNS имя хоста.
object Host "webproxyprodapp01" {
    import "generic-host"
    address = "x.x.x.x"
}
  1. Определение службы и связывание с командой проверки.
apply Service "check_tcp_webproxy" {
    import "generic-service"

    check_command = "tcp"
    host_name = "webproxyprodapp01"
    vars.tcp_port = "3128"

    assign where host.name == "webproxyprodapp01"
}

Применение

Каждый элемент конфигурации имеет своё предназначение. CheckCommand определяет, как именно будет выполнен запрос к хосту. Это мощная команда, которая может проверять доступность TCP порта. Далее, объект Service привязывается к конкретному Host для выполнения проверки, используя параметры из CheckCommand.

Ошибки в вашей первоначальной конфигурации возникли из-за неправильного определения места и способа применения команд. Используя vars.tcp_ports = [3128], необходимо было гарантировать использование этого в цикле apply, однако сам код применения был определён с ошибками синтаксиса и логики.

Заключение

Убедитесь, что каждый параметр и переменная используются по назначению. Конфигурации в Icinga2 требуют чёткого следования структуре. Проверьте, что необходимые модули и плагины (например, monitoring-plugins) установлены и настроены. Использование переменных, таких как "$host.address$" и "$tcp_port$", помогает шаблонизировать команды и снижать риски ошибок при работе с разными конфигурациями хостов и портов.

Оцените материал
Добавить комментарий

Капча загружается...