
Tengo un sistema de aprovisionamiento que configura nuevos hosts para que estén en el dominio test.domain.local, es decir client44.test.domain.local
, y tengo un servidor Icinga que me gustaría monitorear automáticamente todos estos hosts usando expresiones regulares, como *.test.domain.local
.
Todos los clientes recibirán nagios-nrpe-server
el paquete (versión 2.13-3), que también está configurado para permitir que el servidor icinga obtenga datos de ellos, y se ha verificado que funciona.
Por ahora solo vamos a monitorear servicios/cosas que sabemos que tendrán todos los nodos, por ejemplo SSH, respuesta al ping, etc.
he miradoeste enlace¿Pero no entiendo bien la relación entre hosts, grupos de hosts y clases de servicio?
Tanto el servidor Icinga como todos los clientes ejecutan Debian.
Respuesta1
He estado trabajando con fredmu en este problema y se me ocurrió una solución funcional inspirada en la respuesta de Tim Brigham.
Usando la definición predeterminada, generic-host
esto podría resolverse usando un script que genere automáticamente archivos de configuración del host basados en una plantilla. Opcionalmente, se podría realizar como un cronjob para generar estos archivos de forma rutinaria.
generar_host_cfg.sh
#!/usr/bin/env bash
icinga_root="/etc/icinga/objects"
subnet="10.0.0.*"
template="template_icinga.cfg"
alias_file="alias.txt"
# navigate to the Icinga configuration directory
cd $icinga_root
# create first server alias if doesn't exist
if [ ! -e $alias_file ]; then
echo "1" > $alias_file
fi
# iterate through subnet, store "hostname:ip" in associative array
declare -A address
for host in $(nmap -sP $subnet | awk -F '[ ()]' '/for [a-z]+/ {print $5 ":" $7}'); do
address[$(echo $host | cut -d: -f1)]=$(echo $host | cut -d: -f2)
done
# iterate through hosts, create files if not exist based off template
for host in ${!address[@]}; do
host_file=${host}_icinga.cfg
if [ ! -e $host_file ]; then
# fetch new server alias
alias=$(cat $alias_file)
# create the next server alias
expr $alias + 1 > $alias_file
# create hostname_icinga.cfg if doesn't exist, based off template
cp $template $host_file
# replace contents of new template; hostname, alias and ip
sed -i -r \
-e "s/tmp-hostname/$host/" \
-e "s/tmp-alias/Server$alias/" \
-e "s/tmp-address/${address[$host]}/" $host_file
fi
done
plantilla_icinga.cfg
define host{
use generic-host
host_name tmp-hostname
alias tmp-alias
address tmp-address
}
Dando como resultado archivos como estos:
define host{
use generic-host
host_name monitor.company.local
alias Server1
address 10.0.0.1
}
Respuesta2
Hay muchas maneras de abordar esto.
Anteriormente, he ensamblado scripts de bash que se ejecutarían como una única verificación de icinga. Luego, el script verificaría todos los hosts en el subdominio y devolvería un estado basado en si se encontraron fallas o en cuántas.
Más recientemente me he vuelto fanático de los hechos personalizados en títeres. Combinado con una plantilla bien escrita, puede agregar fácilmente sus comprobaciones en una gran cantidad de nodos utilizando un bucle for.