In Icinga (Nagios), how do I configure hosts with multiple IPs?

I'm setting up Icinga (Nagios fork) and I have some machines with multiple interfaces. Some services are only listening on one of them and to check them correctly, I like to know if it's possible to have multiple IP addresses configured for a single host in Icinga.

Here's a minimal example:

Remote Server:

  • eth0: 1.2.3.4 (public IP)
  • eth1: 10.1.2.3 (private IP, secure tunnel)
  • Apache listening on 1.2.3.4:80. (public only)
  • OpenSSH listening on 10.1.2.3:22. (internal network only)
  • Postfix SMTP listening on 0.0.0.0:25 (all interfaces)

Icinga Server:

  • eth0: 10.2.3.4 (private IP, internet access)

Now if I define a host:

define host {
        use                     generic-host
        host_name               server1
        alias                   server1.gertvandijk.net
        address                 10.1.2.3
        }

This will not check the HTTP status correctly. And defining an additional host:

define host {
        use                     generic-host
        host_name               server1-public
        alias                   server1.gertvandijk.net
        address                 1.2.3.4
        }

will check everything, but shows up as two independent hosts. Now I want to 'aggregate' these two hosts to show up as a single host, yet providing an easy configuration to check the services on their proper address.

What is the most elegant number-of-configuration-lines-saving solution to this? I read about several plugins available to workaround this, but I can't figure out what is the current way to address it. Solutions go back to 2003, but I'm running Icinga 1.7.1, already capable of the address6 option, yet that triggers IPv6-only resolving on the hostname...

Ideally, I wish to configure Icinga to be intelligent enough to know that the Postfix instance running on 10.1.2.3:25 is the same as 1.2.3.4:25 and thus not triggering two alarms.

I guess this must have been tackled before and sysadmins have it set up now. Please share your solution to this. Thanks! :)


You can define a custom object variable, something like this:

define host {
        use                     generic-host
        host_name               server1
        alias                   server1.gertvandijk.net
        address                 10.1.2.3
        _wan_address            1.2.3.4
        }

then call it as $_HOSTWAN_ADDRESS$ macro:

define command{
        command_name    check_wan_http
        command_line    $USER1$/check_http -I $_HOSTWAN_ADDRESS$ $ARG1$
        }

define service{
    use                     generic-service
    hostgroup_name          apache
    service_description     Apache
    check_command           check_wan_http
    process_perf_data       0
    contact_groups          admin
}