1.7.18.6.1. rm
Terraform 状态的主要功能是记录下代码中的资源实例地址与其代表的远程对象之间的绑定。通常,Terraform 会自动更新状态以响应应用计划时采取的操作,例如删除已被删除的远程对象的绑定。
terraform state rm
命令可以用来从状态文件中删除对象和实际远程对象的绑定,该命令只是删除绑定,不会删除实际存在的远程对象,删除后 Terraform 会“忘记”这个对象的存在。
注意:从 Terraform v1.7.0 开始支持 removed
块。与 terraform state rm
命令不同,您可以使用 removed
块一次删除多个资源,并且您可以将删除操作作为正常计划和执行工作流程的一部分进行审查。了解有关将 removed
块与资源一起使用以及将 removed
块与模块一起使用的更多信息。
1.7.18.6.1.1. 用法
terraform state rm [options] ADDRESS...
Terraform 将在状态中搜索与给定资源地址匹配的任何实例,并删除所有实例对应的记录,以便 Terraform 将不再跟踪相应的远程对象。
这意味着尽管这些对象仍将继续存在于远程系统中,但后续的 terraform plan
会尝试新建这些被“遗忘”的实例。根据远程系统施加的约束,如果这些对象的名称或其他标识符与仍然存在的旧对象发生冲突,创建这些对象可能会失败。
可以使用如下可选参数:
-dry-run
:报告与给定地址匹配的所有资源实例(由于此时并未执行删除,所以 Terraform 这时还不会“遗忘”任何资源)。-lock=false
:执行时是否先锁定状态文件。如果其他人可能同时对同一工作区运行命令,则这是危险的。-lock-timeout=DURATION
:除非使用-lock=false
禁用锁定,否则命令 Terraform 为上锁操作设置一个超时时长。持续时间语法是一个数字后跟一个时间单位字母,例如“3s”表示三秒。
以下是使用 local
Backend 时可用的遗留参数:
-backup=FILENAME
:指定源状态文件的备份地址,默认为源状态文件加上".backup"后缀-bakcup-out=FILENAME
:指定目标状态文件的备份地址,默认为目标状态文件加上".backup"后缀-state=FILENAME
:源状态文件地址,默认为当前 Backend 或是"terraform.tfstate"-state-out=FILENAME
:目标状态文件地址。如果不指定则使用源状态文件。可以是一个已经存在的文件或新建一个文件
1.7.18.6.1.1.1. 删除一个资源
下面的例子演示了如何让 Terraform “遗忘”所有类型为 packet_device
,并且名为 worker
的资源实例:
$ terraform state rm 'packet_device.worker'
不使用 count
或 for_each
的资源只有一个实例,因此该示例也是选择该单个实例的正确语法。
1.7.18.6.1.1.2. 删除一个模块
$ terraform state rm 'module.foo'
1.7.18.6.1.1.3. 删除一个模块内资源
要选择在子模块中定义的资源,我们必须指定该模块的路径作为资源地址的一部分:
$ terraform state rm 'module.foo.packet_device.worker'
1.7.18.6.1.1.4. 删除一个声明count的资源
使用 count
元参数定义的资源具有多个实例,每个实例都由一个整数标识。我们可以通过在给定地址中包含显式索引来选择特定实例:
$ terraform state rm 'packet_device.worker[0]'
方括号 ([
, ]
) 在某些 shell 中具有特殊含义,因此我们可能需要引用或转义地址,以便将其逐字传递给 Terraform。上面的例子使用了 Unix 风格 shell 的典型引用语法。
1.7.18.6.1.1.5. 删除一个声明for_each的资源
使用 for_each
元参数定义的资源具有多个实例,每个实例都由一个字符串标识。我们可以通过在给定地址中包含显式密钥来选择特定实例。
但是,字符串的语法包含引号,并且引号符号通常在命令 shell 中具有特殊含义,因此我们需要为我们正在使用的 shell 使用适当的引用和/或转义语法。例如:
Linux, MacOS, and Unix:
$ terraform state rm 'packet_device.worker["example"]'
PowerShell:
$ terraform state rm 'packet_device.worker[\"example\"]'
Windows命令行(cmd.exe
):
$ terraform state rm packet_device.worker[\"example\"]