我们有一组服务器,其中任何一个都可能出现故障,生成中等优先级通知:
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 的配置文件,因此可以以编程方式构建复杂的依赖关系——但是这样的触发可以实现吗?
您可以在主机上定义一个事件处理程序,它基本上是一个“基于参数做某事”的小脚本。您可以将主机的状态属性从运行时宏作为命令参数传递。
https://www.icinga.com/docs/icinga1/latest/en/eventhandlers.html
我会走路线并在主机上定义一个自定义变量,该变量定义了在触发事件处理程序时要触发的服务。这样您就不需要在脚本中对它们进行硬编码。
然后,您的脚本可能会决定通过外部命令管道强制执行新服务检查。您可能应该定义 HARD 或 SOFT 状态是否足够 - 请记住,事件处理程序仅在状态更改时触发,而不是在 DOWN->DOWN->DOWN 例如。
示例:https ://github.com/Icinga/icinga-core/blob/master/contrib/eventhandlers/submit_check_result.in
注意:该服务不应启用主动检查,并且不使用虚拟命令,而是使用实际的服务检查命令。
(这样的检查结果提交发生在旧的 Nagios/Icinga1 世界中,如果您正在寻找更多有关命令管道和事件处理程序的示例,那么它也用于有点骇人听闻的分布式监控)。