Terraform 资源定义移动到另一个模块会使';地形应用';要删除并重新创建这些资源?

Terraform 资源定义移动到另一个模块会使';地形应用';要删除并重新创建这些资源?,terraform,Terraform,我用main.tf创建了一些VM,terraform生成了一个cluster.tfstate文件 现在由于重构,我将VM资源定义移动到一个模块中,并在main.tf中引用该模块。当我运行terraformapply--state=./cluster.tfstate时,terraform会销毁并重新创建这些虚拟机吗 我想不会的。我的理解正确吗 让我们使用中给出的示例进行尝试: 如果我们应用terraform这个,我们会得到一个在terraform中被引用为aws\u instance.web的实例

我用main.tf创建了一些VM,terraform生成了一个cluster.tfstate文件

现在由于重构,我将VM资源定义移动到一个模块中,并在main.tf中引用该模块。当我运行
terraformapply--state=./cluster.tfstate
时,terraform会销毁并重新创建这些虚拟机吗


我想不会的。我的理解正确吗

让我们使用中给出的示例进行尝试:

如果我们应用
terraform
这个,我们会得到一个在terraform中被引用为
aws\u instance.web的实例:

应用完成!资源:添加1个,更改0个,销毁0个。

如果我们将此定义移动到模块
ubuntu\u实例
,目录结构可能与
instance.tf中的上述代码类似:

.
├── main.tf
└── ubuntu_instance
    └── instance.tf
现在您打算创建与以前相同的实例,但Terraform内部现在将此资源命名为
module.ubuntu\u instance.aws\u instance.web

如果尝试应用此选项,您将得到以下结果:

计划:1添加,0更改,1销毁。

发生这种情况的原因是Terraform不知道新旧代码引用同一个实例。当您在模块中重构时,您正在删除一个资源,因此Terraform将删除该资源


Terraform将代码映射到状态文件中的真实资源。创建实例时,由于状态文件的原因,您只能知道该实例映射到您的
aws\u实例。所以正确的方法(如所述)是重构代码,然后告诉Terraform将映射从
aws\u instance.web
移动到
module.ubuntu\u instance.aws\u instance.web
到真实实例,然后当您应用时,Terraform将保留实例,因为它符合您的代码说明

你为什么不执行计划看看呢?你的假设是错误的,但是这个计划会告诉你它将要做什么。如果您想知道如何在不破坏虚拟机的情况下进行管理,那么最好将您的问题编辑为该问题,并显示您的地形代码和计划输出。“地形状态mv”对于使用模块更改状态以避免基础设施重建非常有用。解释得很好。
.
├── main.tf
└── ubuntu_instance
    └── instance.tf