Tenho um ambiente assim:
- mestre
- alguns satélites atribuídos ao mestre
- muitos agentes atribuídos aos satélites e alguns atribuídos ao mestre (sem um satélite).
Todos os sistemas estão prontos e a configuração da PKI está concluída. Além disso, a maioria das verificações padrão (apt, disco, cpu) está em execução e posso ver o estado atual no mestre. Agora comecei a implementar verificações personalizadas (como check_eth para monitorar o tráfego de rede). Publiquei o script para todos os hosts e defini também em todos os hosts o comando:
object CheckCommand "check_eth" {
import "plugin-check-command"
command = [ "/usr/bin/sudo", PluginDir + "/check_eth" ]
arguments = {
"-w" = {
value = "$eth_warning$"
description = "Percent free/used when to warn"
required = true
}
"-c" = {
value = "$eth_critical$"
description = "Percent free/used when critical"
required = true
}
"-i" = {
value = "$eth_interface$"
description = "Given network interface"
required = true
}
}
vars.eth_interface = "enp0s31f6"
vars.eth_warning = "2048G"
vars.eth_critical = "4096G"
}
Eu posso executar o script em todos os hosts. No Master, os satélites e todos os hosts que atribuíram diretamente ao master a resposta da verificação são visíveis. Em todos os hosts com parent=satellite o estado é UNKNOWN. E esse é o meu problema... por quê?
O objeto host é como:
# master: /etc/icinga2/zones.conf
object Endpoint "monitor.domain" {
}
object Zone "master" {
endpoints = [ "monitor.domain" ]
}
object Endpoint "satellite1.domain" {
host = "<ip>"
port = "<port>"
}
object Zone "satellite1.domain" {
parent = "master"
endpoints = [ "satellite1.domain" ]
}
A configuração do satélite fica assim:
# master: /etc/icinga2/zones.d/satellite1.domain/hosts.conf
object Host "satellite1.domain" {
import "generic-host"
check_command = "hostalive"
zone = "master"
address = "<ipv4>"
address6 = "<ipv6>"
vars.agent_endpoint = name
...
}
object Host "agent1.domain" {
import "generic-host"
check_command = "hostalive"
zone = "satellite1.domain"
address = "<ipv4>"
address6 = "<ipv6>"
vars.agent_endpoint = name
...
}
...
A zona incl. endpoint dentro do satélite também é definido no mestre:
# master: /etc/icinga2/zones.d/satellite1.domain/zones.conf
object Zone "agent1.domain" {
parent = "satellite1.domain"
endpoints = [ "agent1.domain" ]
}
object Endpoint "agent1.domain" {
host = "<ip>"
port = "<port>"
}
E agora a aplicação do comando ao host (também definido no master)
# master: /etc/icinga2/zones.d/satellite1.domain/services.conf
apply Service "Network Traffic" {
import "generic-service"
check_command = "check_eth"
command_endpoint = host_name
assign where host.name == "satellite1.domain"
}
apply Service "Network Traffic" {
import "generic-service"
check_command = "check_eth"
command_endpoint = host_name
assign where host.name == "agent1.domain"
}
O que eu sinto falta?
Ah, agora descobri o problema. A definição do comando check contém um valor padrão para
eth_interface
o qual existe nos satélites e no mestre. Mas as VMs têm outra interface. Se eu remover as vars padrão do comando check e atribuir por objeto Host essa var, está tudo bem.