如何通过更改主机状态来触发服务检查?

我们有一系列的服务器,其中任何一个都可能导致产生中等优先级的通知:

define host { host_name foo1 contacts medium-priority use default-host } ... 

但是,如果有两台以上的服务器出现故障,我们希望获得更高优先级的通知。 为此,我们使用Nagios / Icinga的check_cluster -utility设置了一个单独的服务定义:

 define service { service_description foo-cluster servicegroups cluster-checks display_name Foo Cluster check_command check_cluster_host!Foo Cluster!0!3!$HOSTSTATEID:foo1$,$HOSTSTATEID:foo2,...$HOSTSTATEID:fooN$ contacts high-priority hostgroup_name clusters notes Check, that no more than 2 hosts in group foo are in trouble use default-service } 

上面可能会起作用,但是我希望这个服务检查不是按时间触发的,而是由任何“底层”主机的状态改变引起的。

我们用Ansible生成Icinga的configuration文件,因此可以通过编程来构build复杂的依赖关系 – 但是这样的触发可以实现吗?

你可以在主机上定义一个事件处理程序,它基本上是一个小脚本“根据参数做某事”。 您可以将运行时macros中的主机状态属性作为命令parameter passing。

https://www.icinga.com/docs/icinga1/latest/en/eventhandlers.html

我会去的路线,并定义一个自定义variables的主机,它定义了触发事件处理程序时触发的服务。 这样你就不需要在脚本中对它们进行硬编码。

你的脚本可能会决定通过外部命令pipe道强制进行新的服务检查。 您可能应该定义HARD还是SOFT状态是否足够 – 请记住,事件处理程序仅在状态更改时触发,而不是DOWN-> DOWN-> DOWN。

例如: https : //github.com/Icinga/icinga-core/blob/master/contrib/eventhandlers/submit_check_result.in

注意:该服务不应该启用主动检查,而不是使用虚拟命令,而是实际的服务检查命令。

(如果你正在寻找更多的命令pipe道和事件处理程序的例子,这样的检查结果提交发生在旧的Nagios / Icinga1世界中,对于分布式监控也有点不妥)。