4

我想避免 terraform 破坏我之前创建的资源,而是创建新的资源。

我/想要像这样使用 terraform:

  • 创建 AWS IAM 组和策略
  • 将用户附加到这些组
  • 我想通过提供外部 var 文件来创建新的组和用户,就像我为上述用户和组所做的那样

但是当我尝试传递新的 var 文件时,我创建了新资源并删除了前一个资源,所以我想创建新资源但仍想保留旧资源,直到我提到我要删除它。

这对我来说真的很困惑,有人可以指出我如何实现它吗?

提前致谢

4

4 回答 4

9

高级 terraform 状态管理很棘手,所以要小心。我已经成功地销毁了其他资源,同时保留了一些。

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

该命令将删除与给定地址匹配的所有项目。

从 Terraform 状态移除的项目不会被物理销毁。从 Terraform 状态中移除的项目不再由 Terraform 管理。例如,如果您从状态中删除一个 AWS 实例,该 AWS 实例将继续运行,但 terraform plan 将不再看到该实例。

从 Terraform 状态文件中删除项目有多种用例。最常见的是重构配置以不再管理该资源(可能将其移动到另一个 Terraform 配置/状态)。

只有在成功删除所有地址后才会保存状态。如果任何特定地址因任何原因出错(例如语法错误),则根本不会修改状态。

此命令将在保存任何更改之前输出状态的备份副本。无法禁用备份。由于此命令的破坏性,需要备份。

terraform state rm resource_to_stay

terraform plan -destroy<- 将对销毁进行“试运行”,确保资源不存在

terraform destroy

terraform import resource_to_stay

terraform plan<- 这应该有导入资源的输出,确保它不会被删除,也就是显示为红色。

terraform apply

于 2017-06-10T22:44:26.027 回答
1

我认为 Terraform 不会那样工作。Terraform 的主要特点之一如下。

基础设施即代码:基础设施是使用高级配置语法描述的。这允许您对数据中心的蓝图进行版本控制和处理,就像您处理任何其他代码一样。此外,基础设施可以共享和重用。

如果您开始从单个 Terraform 资源中拥有多个“实际”资源,那么您就失去了基础设施的定义性质。这是 Terraform 资源...一种实际资源吗?五?十?您无法通过阅读代码来判断。

回到你的问题,我认为你有几个选择,但最终它仍然会回到具体定义资源。你最好的选择,特别是如果你想减少样板,可能是modules

于 2016-04-04T15:40:31.500 回答
1

您可能想查看 Terraform 模块 - https://www.terraform.io/docs/modules/

然后,您可以通过“实例化”一个模块来创建一组资源,并通过再次这样做来创建另一组。

于 2016-04-19T17:34:26.380 回答
0

这可以通过执行来欺骗 Terraform 状态文件 terraform state rm 'resourcetype.resourcename' format

我不得不删除之前由 Terraform 创建的 Route53 条目,但现在我们想删除它,因为如果当前状态不匹配,Terraform 会破坏它。

因此,terraform state rm 'aws_route53_record.nameofmyroute53record'这更新了 S3 位置中的状态文件,下一次当我们触发 terraform 脚本来计划/销毁和应用 R53 条目时,由于 terraform 不知道它,所以没有触及它。

详细用法见https://www.terraform.io/docs/commands/state/rm.html

于 2020-11-26T13:08:25.273 回答