我想避免使用terraform来破坏我之前创建的资源,而是创建新资源。
我/想要使用这样的terraform:
但是当我尝试传递新的var文件时,我创建了新的资源并删除了前一个文件,所以我想创建新的资源,但仍然想要保留旧资源,直到我提到我想删除它。
这对我来说真的很困惑,有人能指出我是如何实现它的吗?
提前致谢
答案 0 :(得分:4)
Advance terraform state management很棘手,所以要小心。我保留了一些成功地破坏了其他资源。
用法:terraform state rm [options] ADDRESS ...
该命令将删除与给定地址匹配的所有项目。
从Terraform状态中删除的项目不会被物理破坏。从Terraform状态中删除的项目不再由Terraform管理。例如,如果从状态中删除AWS实例,AWS实例将继续运行,但terraform计划将不再看到该实例。
从Terraform状态文件中删除项目有多种用例。最常见的是重构配置以不再管理该资源(可能将其移动到另一个Terraform配置/状态)。
只有在成功删除所有地址后才会保存状态。如果出于任何原因(例如语法错误)出现任何特定地址错误,则根本不会修改状态。
此命令将在保存任何更改之前输出状态的备份副本。无法禁用备份。由于此命令具有破坏性,因此需要进行备份。
terraform state rm resource_to_stay
terraform plan -destroy
< - 将对破坏进行“干运行”,确保资源不存在
terraform destroy
terraform import resource_to_stay
terraform plan
< - 这应该有导入资源的输出,确保它不会被删除,也就是显示为红色。
terraform apply
答案 1 :(得分:1)
我不认为Terraform会这样工作。 Terraform的主要特征之一如下。
基础架构代码:使用高级配置语法描述基础架构。这样可以像对待任何其他代码一样对数据中心的蓝图进行版本控制和处理。此外,可以共享和重用基础架构。
如果您开始从单个Terraform资源中获得多个“实际”资源,那么您已经失去了基础架构的定义特性。这是Terraform资源......一个实际的资源吗?五?十?你无法通过阅读代码来判断。
回到你的问题,我认为你有一些选择,但最终还是会回来专门定义资源。您最好的选择,特别是如果您想减少样板,可能是modules。
答案 2 :(得分:1)
您可能希望查看Terraform模块 - https://www.terraform.io/docs/modules/
然后,您可以通过"实例化"来创建一组资源。一个模块,再次通过这样做创建另一个集合。
答案 3 :(得分:0)
可以通过执行来欺骗Terraform状态文件
terraform state rm 'resourcetype.resourcename' format
我必须删除先前由Terraform创建的Route53条目,但是现在我们希望将其删除,因为如果当前状态不匹配,Terraform会破坏它。
因此terraform state rm 'aws_route53_record.nameofmyroute53record'
会更新S3位置中的状态文件
下次当我们触发terraform脚本来计划/销毁并应用R53条目时,由于terraform并不了解它,因此未受影响。