将子网中的所有主机添加到 icinga 监控中,无需指定主机名/IP

将子网中的所有主机添加到 icinga 监控中,无需指定主机名/IP

我有一个配置系统,将新主机设置为域 test.domain.local 中的主机,即client44.test.domain.local,并且我有一个 Icinga 服务器,我想使用正则表达式自动监控所有这些主机,例如*.test.domain.local

所有客户端都将获得nagios-nrpe-server(版本 2.13-3)包,该包也配置为允许 icinga-server 从它们那里获取数据,并且已经验证可以正常工作。

我们现在只是要监控我们知道所有节点都会有的服务/事物,例如 SSH、对 ping 的响应等。

我看过此链接但我不太清楚主机、主机组和服务类别之间的关系?

Icinga 服务器和所有客户端均运行 Debian。

答案1

我一直在与 fredmu 合作解决这个问题,并受到 Tim Brigham 的回答的启发,想出了一个可行的解决方案。

使用默认generic-host定义,可以使用基于模板自动生成主机配置文件的脚本来解决此问题。也可以选择将其作为 cronjob 定期生成这些文件。

生成主机配置文件

#!/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

模板_icinga.cfg

define host{
        use                     generic-host
        host_name               tmp-hostname
        alias                   tmp-alias
        address                 tmp-address
        }

生成如下文件:

define host{
        use                     generic-host
        host_name               monitor.company.local
        alias                   Server1
        address                 10.0.0.1
        }

答案2

有很多方法可以解决这个问题。

我之前已经编写了可以作为单个 icinga 检查运行的 bash 脚本。然后,该脚本将检查子域中的所有主机,并根据是否发现故障或发现多少故障返回状态。

最近,我成了 Puppet 中自定义事实的粉丝。结合编写良好的模板,您可以使用 for 循环轻松地在大量节点中添加检查。

相关内容