[comment]: # ({41c636fc-d5d0048d})
# 触发器依赖关系

触发器依赖关系可用于避免与根本原因无关的告警。

请参见所有[最佳实践](/manual/config/triggers/best_practices)。

[comment]: # ({/41c636fc-d5d0048d})

[comment]: # ({520fe3ce-26bda053})
### 概述

有时，一个主机的可用性取决于另一个主机。  
位于路由器后面的服务器，如果路由器宕机，就会变得不可达。  
如果为两者都配置了触发器，你可能会收到两个主机都宕机的通知，而实际上只有路由器才是罪魁祸首。

这时，主机之间的某种依赖关系就可能很有用。  
设置依赖后，可以暂缓发送从属对象的通知，只发送根本问题的通知。

虽然 Zabbix 不直接支持主机之间的依赖关系，但可以通过另一种更灵活的方法来定义它们 - 触发器依赖。  
一个触发器可以依赖一个或多个触发器。

因此，在我们的简单示例中，我们打开服务器触发器配置表单，并设置它依赖于路由器对应的触发器。  
有了这样的依赖关系，只要它所依赖的触发器处于 'PROBLEM' 状态，服务器触发器就不会改变其状态 - 因而不会执行任何从属动作，也不会发送任何通知。

如果服务器和路由器都宕机，并且设置了 "server down" 触发器与 "router down" 触发器之间的依赖关系，Zabbix 将不会为从属触发器执行动作。

当父触发器处于 PROBLEM 状态时，其从属触发器报告的值可能不可信。  
因此，在父触发器（上例中的路由器）满足以下任一条件之前，从属触发器不会重新评估：

-   从 'PROBLEM' 状态恢复为 'OK' 状态；
-   状态从 'PROBLEM' 变为 'UNKNOWN'；
-   通过手动方式、关联规则，或借助 [date and time](/manual/config/triggers/expression/time) 和/或 [nodata()](/manual/config/triggers/expression/history#nodata) 函数被关闭；
-   通过不参与从属触发器的监控项值得到解决；
-   被禁用，或其监控项被禁用，或其监控项所属主机被禁用

在上述所有情况下，从属触发器（服务器）只有在收到新的指标后才会重新评估。  
这意味着从属触发器可能不会立即更新。

另外：

-   触发器依赖可以从任意主机触发器添加到任意其他主机触发器，只要不会导致循环依赖。
-   触发器依赖可以从一个模板添加到另一个模板。  
如果模板 A 中的某个触发器依赖于模板 B 中的某个触发器，那么模板 A 只能与模板 B 一起链接到主机（或另一个模板），但模板 B 可以单独链接到主机（或另一个模板）。
-   触发器依赖可以从模板触发器添加到主机触发器。  
在这种情况下，将该模板链接到主机时，会创建一个主机触发器，该主机触发器依赖于与原触发器所依赖的相同模板触发器。  
例如，这允许你创建一个模板，其中某些触发器依赖于路由器（主机）触发器。  
所有链接到该模板的主机都将依赖于那个特定的路由器。
-   触发器依赖不能从主机触发器添加到模板触发器。
-   触发器依赖可以从触发器原型添加到另一个触发器原型（在同一个低级别发现规则内）或真实触发器。  
触发器原型不能依赖于来自不同 LLD 规则的触发器原型，也不能依赖于由触发器原型创建的触发器。  
主机触发器原型不能依赖于模板中的触发器。

[comment]: # ({/520fe3ce-26bda053})

[comment]: # ({3efffbf7-c4578b73})
### 配置

要定义依赖关系：

1. 打开触发器[配置表单](/manual/config/triggers/trigger#configuration)中的 *Dependencies* 选项卡。
2. 在 *Dependencies* 部分点击 *Add*，并选择一个或多个该触发器将依赖的触发器。

    ![](../../../../../assets/en/manual/config/triggers/dependency.png){width="600"}

3. 点击 *Update*。

现在，触发器在列表中会显示其依赖关系的标识。

![](../../../../../assets/en/manual/config/triggers/dependency_list.png)

[comment]: # ({/3efffbf7-c4578b73})

[comment]: # ({4cbfb1d1-4dc2ce6b})
##### 多个依赖关系示例

例如，主机位于 Router2 后面，而 Router2 位于 Router1 后面。

```default
Zabbix - Router1 - Router2 - Host
```

如果 Router1 宕机，那么显然主机和 Router2 也都不可达，但同时收到关于主机、Router1 和 Router2 全部宕机的三条通知就显得过多了。

因此，在这种情况下，我们定义两个依赖关系：

```default
the 'Host is down' trigger depends on the 'Router2 is down' trigger
the 'Router2 is down' trigger depends on the 'Router1 is down' trigger
```

在更改 'Host is down' 触发器的状态之前，Zabbix 会检查相应的触发器依赖关系。
如果找到了此类依赖关系，并且其中某个触发器处于 **`Problem`** 状态，那么触发器状态将不会更改，也不会执行操作，并且不会发送任何通知。

Zabbix 会递归执行此检查。
如果 Router1 或 Router2 不可达，Host 触发器将不会更新。

[comment]: # ({/4cbfb1d1-4dc2ce6b})
