Вопрос или проблема
Я просто хочу выполнить запрос к хосту в 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
– за конкретные команды проверки, которые можно применять к сервисам.
Пример
Начнем с исправления вашей конфигурации.
- Определение
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"
}
}
}
- Определение хоста. Здесь просто задаем IP-адрес или DNS имя хоста.
object Host "webproxyprodapp01" {
import "generic-host"
address = "x.x.x.x"
}
- Определение службы и связывание с командой проверки.
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$"
, помогает шаблонизировать команды и снижать риски ошибок при работе с разными конфигурациями хостов и портов.