跳至主要内容

强制重新创建资源

在规划期间,OpenTofu 默认情况下会检索每个现有对象的最新状态,并将其与当前配置进行比较,只针对当前状态与配置不匹配的对象进行计划操作。

但是,在某些情况下,远程对象可能会以 OpenTofu 无法自动检测到的方式损坏或降级。例如,如果在虚拟机中运行的软件崩溃,但虚拟机本身仍在运行,则 OpenTofu 通常无法检测和响应此问题,因为 OpenTofu 只直接管理整个机器。

如果您知道某个对象已损坏,或者您想强制 OpenTofu 替换它以任何其他原因,则可以使用 -replace=... 规划选项 覆盖 OpenTofu 的默认行为,当您运行 tofu plantofu apply 时。

代码块
$ tofu apply -replace="aws_instance.example"
# ...

# aws_instance.example will be replaced, as requested
-/+ resource "aws_instance" "example" {
# ...
}

"受污染" 状态

有时 OpenTofu 能够自动推断出某个对象处于不完整或降级状态。例如,如果复杂对象的创建失败,以至于该对象的部分内容已存在于远程系统中,或者如果对象的创建成功,但配置步骤随后失败,OpenTofu 必须记住该对象存在,但可能不完全正常运行。

OpenTofu 通过在状态中将对象标记为 "受污染" 来表示这种情况。当对象被标记为此状态时,下一个计划将强制替换该对象,这与您使用上面描述的 -replace=... 指定了该对象的地址类似。

代码块
  # aws_instance.example is tainted, so it must be replaced
-/+ resource "aws_instance" "example" {
# ...
}

如果 OpenTofu 已将某个对象标记为受污染,但您认为它运行正常,并且不想替换它,则可以使用 tofu untaint 命令 覆盖 OpenTofu 的判断,之后 OpenTofu 将认为该对象已准备好供任何下游资源声明使用。

您也可以强制 OpenTofu 将特定对象标记为受污染,方法是使用 tofu taint 命令,但这方法已弃用,建议改用 -replace=... 选项,该选项避免了需要使用受污染的对象创建临时状态快照。