介绍
服务和主机依赖性是Nagios的一项高级功能,可让您根据一个或多个其他主机或服务的状态来控制主机和服务的行为。我将解释依赖项如何工作,以及主机和服务依赖项之间的区别。
服务依赖关系概述
提示:在许多情况下,父/子服务关系是表达服务依赖关系的一种简单得多的方法。服务父关系是通过服务定义中的Parents指令定义的。
关于服务依赖项,您应该了解以下几点:
- 一项服务可以依赖于一项或多项其他服务
- 服务可以依赖于不与同一主机关联的服务
- 服务依赖项不会继承(除非专门配置为)
- 服务依赖项可用于导致服务检查执行和服务通知在不同情况下(OK,WARNING,UNKNOWN和/或CRITICAL状态)被禁止。
- 服务依赖性可能仅在特定时间段内有效
定义服务依赖性
首先,基础知识。
通过在对象配置文件中添加服务依赖项定义来创建服务依赖项。在每个定义指定的从属服务,你正在服务取决于,并且使得执行并通知依赖失败(这些将在后面叙述)的标准(如果有的话)。
您可以为给定服务创建多个依赖关系,但是必须为创建的每个依赖关系添加单独的服务依赖关系定义。
示例服务依赖项
下图显示了服务通知和执行依赖关系的示例逻辑布局。不同的服务依赖于其他服务来进行通知和检查执行。
在此示例中,主机C上服务F的依赖项定义如下:
define servicedependency {
host_name Host B
service_description Service D
dependent_host_name Host C
dependent_service_description Service F
execution_failure_criteria o
notification_failure_criteria w,u
}
define servicedependency {
host_name Host B
service_description Service E
dependent_host_name Host C
dependent_service_description Service F
execution_failure_criteria n
notification_failure_criteria w,u,c
}
define servicedependency {
host_name Host B
service_description Service C
dependent_host_name Host C
dependent_service_description Service F
execution_failure_criteria w
notification_failure_criteria c
}
上图中显示的其他依赖项定义将定义如下:
define servicedependency {
host_name Host A
service_description Service A
dependent_host_name Host B
dependent_service_description Service D
execution_failure_criteria u
notification_failure_criteria n
}
define servicedependency {
host_name Host A
service_description Service B
dependent_host_name Host B
dependent_service_description Service E
execution_failure_criteria w,u
notification_failure_criteria c
}
define servicedependency {
host_name Host B
service_description Service C
dependent_host_name Host B
dependent_service_description Service E
execution_failure_criteria n
notification_failure_criteria w,u,c
}
如何测试服务依赖性
在Nagios执行服务检查或发送服务通知之前,它将检查该服务是否具有任何依赖关系。如果没有任何依赖关系,则执行检查或按通常的方式发送通知。如果该服务确实具有一个或多个依赖项,则Nagios Core将按照以下方式检查每个依赖项:
- Nagios获取依赖的服务的当前状态*。
- Nagios Core将依赖的服务的当前状态与依赖项定义中的执行或通知失败选项进行比较(以当时相关的一项为准)。
- 如果所依赖的服务的当前状态与故障选项之一匹配,则说明该依赖项已失败,并且Nagios Core将脱离依赖项检查循环。
- 如果所依赖的服务的当前状态与该依赖项的任何失败选项都不匹配,则表示该依赖项已通过,Nagios Core将继续检查下一个依赖项。
该循环一直持续到检查完该服务的所有依赖项或一次依赖项检查失败为止。
注意:*要注意的一件事是,默认情况下,Nagios Core会在进行相关性检查时使用所依赖的服务的最新硬状态。如果要让Nagios Core使用服务的最新状态(无论其是软状态还是硬状态),请启用soft_state_dependencies选项。
执行依赖
执行依赖关系用于限制何时可以执行服务的主动检查。被动检查不受执行依赖性的限制。
如果针对该服务的所有执行依赖性测试都通过了,Nagios Core将照常执行该服务的检查。如果仅一项服务的执行依赖项失败,Nagios Core将暂时阻止执行该(依赖项)服务的检查。在将来的某个时候,该服务的执行依赖性测试可能会全部通过。如果发生这种情况,Nagios Core将像往常一样再次开始检查服务。有关检查调度逻辑的更多信息,请参见此处。
在上面的示例中,如果服务B处于警告或未知状态,则服务E的执行依赖项将失败。如果是这种情况,将不会执行服务检查,并且会安排检查在以后执行(潜在)执行。
通知依存关系
如果针对该服务的所有通知依赖项测试均通过,则Nagios Core将照常发送该服务的通知。如果仅一项服务的通知依赖项失败,则Nagios Core会临时抑制该(依赖项)服务的通知。在将来的某个时候,该服务的通知依赖项测试可能全部通过。如果发生这种情况,Nagios Core将重新开始发送通知,就像通常对该服务一样。有关通知逻辑的更多信息,请参见此处。
在上面的例子中,服务˚F会有失败通知的依赖关系,如果服务C是处于临界状态,和/或 服务d处于警告或未知状态,和/或如果Service电子处于警告,未知或CRITICAL状态。如果是这种情况,则不会发送该服务的通知。
依赖继承
如前所述,默认情况下不会继承服务依赖项。在上面的示例中,您可以看到服务F依赖于服务E。但是,它不会自动继承服务E对服务B和服务C的依赖关系。为了使服务F依赖服务C,我们必须添加另一个服务依赖关系定义。没有服务B的依赖项定义,因此服务F不依赖于服务B。
如果确实希望使服务依赖项可继承,则必须在服务依赖项定义中使用Inherits_parent指令。启用此指令后,它表示依赖项继承了所依赖服务(也称为主服务)的依赖项。换句话说,如果主服务依赖于其他服务,并且其中任何一个依赖关系失败,则该依赖关系也会失败。
在上面的示例中,假设您想为服务F添加新的依赖关系以使其依赖于服务A。您可以创建一个新的依赖关系定义,该定义将服务F指定为依赖服务,将服务A指定为主服务(即所依赖的服务)。您也可以修改服务D和F的依赖项定义,如下所示:
define servicedependency {
host_name Host B
service_description Service D
dependent_host_name Host C
dependent_service_description Service F
execution_failure_criteria o
notification_failure_criteria n
inherits_parent 1
}
由于启用了Inherits_parent指令,因此将在测试服务F和D之间的依赖关系时测试服务A和D之间的依赖关系。
依赖项可以具有多个继承级别。如果A和D之间的依赖关系定义启用了Inherits_parent指令,并且服务A依赖于某些其他服务(我们称其为服务G),则服务F将依赖于服务D,A和G(每一个可能具有不同的条件) )。
主机依赖性
如您所料,主机依赖项以与服务依赖项类似的方式工作。区别在于它们是针对主机而不是服务。
提示:不要将主机依赖项与父/子主机关系混淆。在大多数情况下,应该使用父/子主机关系(通过主机定义中的Parents指令定义),而不是主机依赖性。可以在有关网络可达性的文档中找到有关父/子主机关系如何工作的描述。
以下是有关主机依赖关系的基础知识:
- 主机可以依赖一个或多个其他主机
- 主机依赖关系不会继承(除非专门配置为)
- 主机依赖关系可用于导致主机检查执行,并且在不同情况(UP,DOWN和/或UNREACHABLE状态)下抑制主机通知。
- 主机依存关系可能仅在特定时间段内有效
示例主机依赖项
下图显示了主机通知依赖项的逻辑布局示例。不同的主机依赖于其他主机进行通知。
在上面的示例中,主机C的依赖项定义将定义如下:
define hostdependency {
host_name Host A
dependent_host_name Host C
notification_failure_criteria d
}
define hostdependency {
host_name Host B
dependent_host_name Host C
notification_failure_criteria d,u
}
与服务相关性一样,主机相关性也不会被继承。在示例图像中,您可以看到主机C没有继承主机B的主机依赖性。为了使主机C依赖于主机A,必须定义一个新的主机依赖性定义。
主机通知依存关系与服务通知依存关系的工作方式相似。如果对主机的所有通知依赖项测试均通过,则Nagios Core将像往常一样向主机发送通知。如果主机的通知依赖关系中只有一个发生故障,Nagios Core就会临时抑制该(依赖)主机的通知。在将来的某个时候,主机的通知依赖项测试可能全部通过。如果发生这种情况,Nagios Core将重新开始发送通知,就像通常发送给主机一样。有关通知逻辑的更多信息,请参见此处。