跳至主要内容

资源图

OpenTofu 从 OpenTofu 配置构建一个 依赖关系图,并遍历此图以生成计划、刷新状态等。此页面记录了此图中包含的内容、节点类型以及图边如何确定的详细信息。

有关图论的一些背景信息以及 OpenTofu 如何应用图论的摘要,请参阅 HashiCorp 2016 年的演示文稿 将图论应用于基础设施即代码。此演示文稿还涵盖了一些与以下指南类似的想法。

图节点

图中存在的节点类型只有少数几种。在解释它们是如何确定和构建之前,我们将首先介绍这些节点类型。

  • 资源节点 - 表示单个资源。如果您设置了 count 元参数,则每个计数将对应一个资源节点。正在更改的资源的配置、差异、状态等都附加到此节点。

  • 提供者配置节点 - 表示完全配置提供者所需的时间。这是将提供者配置块提供给提供者(例如 AWS 安全凭证)的时候。

  • 资源元节点 - 表示一组资源,但本身不代表任何操作。这是为了方便依赖关系并使图更美观。此节点仅存在于 count 参数大于 1 的资源中。

使用 tofu graph 可视化配置时,您可以看到所有这些节点。

构建图

构建图的过程分几个步骤进行。

  1. 根据配置添加资源节点。如果存在差异(计划)或状态,则将这些元数据附加到每个资源节点。

  2. 如果资源定义了任何配置器,则将其映射到配置器。必须在创建所有资源节点后执行此操作,以便具有相同配置器类型的资源可以共享配置器实现。

  3. 来自 depends_on 元参数的显式依赖关系用于在资源之间创建边。

  4. 如果存在状态,则将任何“孤立”资源添加到图中。孤立资源是指在配置中不再存在但在状态文件中存在的任何资源。孤儿资源从未与其关联任何配置,因为状态文件不存储配置。

  5. 将资源映射到提供者。为这些提供者创建提供者配置节点,并创建边,使资源依赖于其相应的提供者配置。

  6. 解析资源和提供者配置中的插值以确定依赖关系。对资源属性的引用将转换为从包含插值的资源到被引用的资源的依赖关系。

  7. 创建一个根节点。根节点指向所有资源,并创建它以便依赖关系图具有单个根。遍历图时,将忽略根节点。

  8. 如果存在差异,则遍历所有资源节点并查找正在销毁的资源。这些资源节点将拆分为两个:一个节点销毁资源,另一个节点创建资源(如果正在重新创建)。节点必须拆分的原因是销毁顺序通常与创建顺序不同,因此它们不能由单个图节点表示。

  9. 验证图中没有循环并且只有一个根。

遍历图

要遍历图,将执行标准的深度优先遍历。图遍历是并行进行的:一旦节点的所有依赖项都已遍历,就会遍历该节点。

使用信号量限制并行度,以防止过多的并发操作压垮运行 OpenTofu 的机器资源。默认情况下,图中最多会同时处理 10 个节点。此数字可以通过在 planapplydestroy 命令上使用 -parallelism 标志进行设置。

设置 -parallelism 被认为是高级操作,在正常使用 OpenTofu 时通常不需要。它可能在某些特殊用例或帮助调试 OpenTofu 问题时有所帮助。

请注意,某些提供商(例如 AWS)通过在其各自的 API 客户端中实现优雅的回退/重试机制,在更低级别处理 API 速率限制问题。出于这个原因,OpenTofu 不会直接使用此 parallelism 功能来解决 API 速率限制。