Distributed Ping Monitoring - Single IP Pool to be pinged by every Icinga-satellite/agent

Is it possible to have a list of hosts to be monitored for ping latency that EVERY satellite monitors ?

We want to monitor our network from multiple outside instances, like smokeping but make it work within icinga.

I’m very new to icinga, but since I seemingly cannot have the same host in multiple zones, it doesnt seem like this is easily done.

Ideally, I would like to have 1 Master Icinga Web2 interface, and then a ton of satellites spread out across the world, and all monitor the same list of IPs, but it seems if I have multiple satellites attached to the an IP(host) to monitor, its load-balanced/round-robin. I need ALL satellites pinging the list of hosts.

Will I have to dynamically create new host configurations with new names for each satellite zone?

I’d like to automate this all within ansible when we deploy a new satellite, but its becoming cumbersome.

  1. create a service template check_ping / or check_icmp.
  2. attach service template for each host from your list to each satellite, with command_endpoint=satelitename

now each satellite checks the ping to each host from your list.

so if I have 100 different satellites, I’ll have to have 100 different command_endpoint attachments ? can command_endpoint be an array? or will that make it load-balanced (which i do not want)

and thanks for the help

if you have 10 host you will have 10 Ping services on one satelite.
each service has as a command endpoint the satellite

if you have 100 Satellite that makes 1000 individual services.

if you introduce a host_templates it will reduce redundancy once more.

host_template has n ping service (one service for each host in your host list)

apply host template to each satellite

thanks nick. I’ll work on it.

No, load balancing would only occur when multiple satellites are configured within the same zone (which is even not allowed since the maximum number of satellites within one zone must not exceed 2). In your case every satellite has its own zone.

I would make a configuration like that:

object Host "host" {
  address = "ipaddress"
  check_command = "hostalive"
}

var ping_sources = [ "source1", "source2", "source3", ... ]

for (ping_source in ping_sources) {
  object Service "ping from " + ping_source use (ping_source) {
    import ping
    command_endpoint = ping_source
  }
}

As an alternative to manage the list your own you could tinker around with get_objects and filter if this is an option because of your internal logic.

var ping_sources = get_objects(Endpoint).filter((endpoint) => match("*satellite*", endpoint.name))

And if you need to ping multiple addresses at once look into fping instead of ping, but I think you need to create your own script then.

2 Likes

thanks everyone , this turned into quite a large project having never used nagios or icinga, appreciate the quick and kind corrections to my thoughts