跳至主要内容

资源行为

一个 resource 块声明你希望一个特定的基础设施对象存在,并具有给定的设置。如果你第一次编写新的配置,它定义的资源将存在于配置中,并且不会代表目标平台中的真实基础设施对象。

应用 OpenTofu 配置是指创建、更新和销毁真实的基础设施对象,以便其设置与配置匹配。

OpenTofu 如何应用配置

当 OpenTofu 创建一个由 resource 块表示的新基础设施对象时,该真实对象的标识符将保存在 OpenTofu 的 状态 中,允许它在响应未来更改时进行更新和销毁。对于在状态中已经关联了基础设施对象的资源块,OpenTofu 会将对象的实际配置与配置中给出的参数进行比较,如果需要,会更新对象以匹配配置。

总之,应用 OpenTofu 配置将

  • 创建存在于配置中但未与状态中的真实基础设施对象关联的资源。
  • 销毁存在于状态中但在配置中不再存在的资源。
  • 遗忘存在于状态中但在配置中不再存在,并且在配置中的 removed 块中引用的资源。
  • 就地更新其参数已更改的资源。
  • 销毁并重新创建其参数已更改,但由于远程 API 限制无法就地更新的资源。

这种通用行为适用于所有资源,无论其类型如何。创建、更新或销毁资源的具体含义对于每种资源类型都是不同的,但这一套标准动词在所有资源中都是通用的。

resource 块中的元参数(在下面的部分中有说明)允许在每个资源的基础上自定义这种标准资源行为的一些细节。

访问资源属性

OpenTofu 模块内的 表达式 可以访问有关同一模块中资源的信息,你可以使用这些信息来帮助配置其他资源。使用 <RESOURCE TYPE>.<NAME>.<ATTRIBUTE> 语法在表达式中引用资源属性。

除了配置中指定的参数外,资源通常还提供从远程 API 获取信息的只读属性;这通常包括在资源创建之前无法知道的信息,比如资源的唯一随机 ID。

许多提供商还包含 数据源,这是一种特殊的资源类型,只用于查找信息。

要查看资源或数据源类型提供的属性列表,请查阅其文档;这些属性通常包含在其可配置参数列表下面的第二个列表中。

有关在表达式中引用资源属性的更多信息,请参阅 表达式:引用资源属性

资源依赖关系

配置中的大多数资源没有特定的关系,OpenTofu 可以并行更改多个无关资源。

但是,一些资源必须在其他特定资源之后进行处理;有时这是因为资源的工作方式,有时是资源的配置需要另一个资源生成的信息。

大多数资源依赖关系是自动处理的。OpenTofu 分析 resource 块中的任何 表达式 以查找对其他对象的引用,并将这些引用视为创建、更新或销毁资源时的隐式排序要求。由于大多数具有行为依赖关系的资源也引用了这些资源的数据,因此通常不需要手动指定资源之间的依赖关系。

但是,某些依赖关系无法在配置中隐式识别。例如,如果 OpenTofu 必须管理访问控制策略以及执行需要这些策略存在的操作,则访问控制策略与创建依赖于它的资源之间存在隐藏的依赖关系。在这些罕见的情况下,depends_on 元参数 可以显式地指定依赖关系。

你还可以使用 replace_triggered_by 元参数 来在原本独立的资源之间添加依赖关系。它强制 OpenTofu 在引用资源或资源属性发生更改时替换父资源。

仅限本地的资源

虽然大多数资源类型对应于通过远程网络 API 管理的基础设施对象类型,但某些专门的资源类型仅在 OpenTofu 本身内运行,计算某些结果并将这些结果保存在状态中以供将来使用。

例如,本地专用资源类型存在于 生成私钥签发自签名 TLS 证书,甚至 生成随机 ID。虽然这些资源类型通常比管理“真实”基础设施对象的那些资源类型用途更边缘化,但它们可以用作将其他资源连接在一起的粘合剂。

本地专用资源的行为与所有其他资源相同,但它们的结果数据仅存在于 OpenTofu 状态中。“销毁”这样的资源仅意味着将其从状态中删除,丢弃其数据。