跳至主要内容

命令:state rm

OpenTofu 状态 的主要功能是跟踪配置中资源实例地址与它们所代表的远程对象之间的绑定关系。通常情况下,OpenTofu 会在应用计划时自动更新状态,例如,在删除了现在已删除的远程对象的绑定时,会删除相应的绑定。

在以下不太常见的情况下,可以使用 tofu state rm:您希望删除对现有远程对象的绑定,而无需先销毁它,这将有效地使 OpenTofu "忘记" 该对象,而该对象将继续存在于远程系统中。

用法

用法:tofu state rm [options] ADDRESS...

OpenTofu 将在状态中搜索与给定 资源地址 匹配的任何实例,并删除每个实例的记录,以便 OpenTofu 不再跟踪相应的远程对象。

这意味着,尽管这些对象仍将继续存在于远程系统中,但随后的 tofu plan 将包括一个操作,用于为每个 "被遗忘" 的实例创建新的对象。根据远程系统施加的约束,如果创建的对象的名称或其他标识符与仍然存在的旧对象发生冲突,创建这些对象可能会失败。

此命令还接受以下选项

  • -dry-run - 报告与给定地址匹配的所有资源实例,而不会实际 "忘记" 任何实例。

  • -lock=false - 在操作期间不要持有状态锁。如果其他人可能同时对同一个工作区运行命令,这将很危险。

  • -lock-timeout=DURATION - 除非使用 -lock=false 禁用锁定,否则指示 OpenTofu 在返回错误之前尝试获取锁一段时间。持续时间语法是一个数字后跟一个时间单位字母,例如 "3s" 代表三秒。

  • -var 'NAME=VALUE' - 为在配置的根模块中声明的单个 输入变量 设置值。多次使用此选项以设置多个变量。有关更多信息,请参阅 命令行上的输入变量

  • -var-file=FILENAME - 使用来自 "tfvars" 文件 的定义,为在配置的根模块中声明的许多 输入变量 设置值。多次使用此选项以包含来自多个文件的值。

除了 -var-var-file 选项之外,还有其他几种方法可以为根模块中的输入变量设置值。有关更多信息,请参阅 为根模块变量分配值

对于使用 cloud 后端remote 后端 的配置,tofu state rm 还接受选项 -ignore-remote-version

对于使用 local 状态 rm 的配置,tofu state rm 还接受旧的选项 -state-state-out-backup

示例:删除资源的所有实例

以下示例将导致 OpenTofu “忘记” 所有名为“worker” 的 packet_device 资源实例。

代码块
$ tofu state rm 'packet_device.worker'

不使用 countfor_each 的资源只有一个实例,因此这也是选择该单个实例的适当语法。

示例:删除模块中所有资源的实例

要选择在子模块中定义的资源,您必须在资源地址中指定该模块的路径。

代码块
$ tofu state rm 'module.foo.packet_device.worker'

示例:删除模块中所有资源的所有实例

以下示例将导致 OpenTofu “忘记” 与名为 foo 的模块的所有实例中定义的所有资源相关联的所有实例。

代码块
$ tofu state rm 'module.foo'

示例:使用 count 删除资源的特定实例

使用 count 元参数 定义的资源具有多个实例,每个实例由一个整数标识。您可以通过在给定地址中包含显式索引来选择特定实例。

代码块
$ tofu state rm 'packet_device.worker[0]'

方括号 ([, ]) 在某些 shell 中具有特殊含义,因此您可能需要引用或转义地址,以便将其字面意义传递给 OpenTofu。以上显示了 Unix 风格 shell 的典型引用语法。

示例:使用 for_each 删除资源的特定实例

使用 for_each 元参数 定义的资源具有多个实例,每个实例由一个字符串标识。您可以通过在给定地址中包含显式键来选择特定实例。

但是,字符串的语法包括引号,而引号符号通常在命令 shell 中具有特殊含义,因此您需要使用您正在使用的 shell 的适当引用和/或转义语法。例如

Unix 风格的 shell,例如 Linux 或 macOS 上的 shell

代码块
$ tofu state rm 'packet_device.worker["example"]'

Windows 命令提示符 (cmd.exe)

代码块
$ tofu state rm packet_device.worker[\"example\"]

PowerShell

代码块
$ tofu state rm 'packet_device.worker[\"example\"]'