在 terraform apply 之前是否需要 terraform destroy?

Is terraform destroy needed before terraform apply?

在 terraform apply 之前是否需要 terraform destroy?如果不是,您在更新现有基础架构时遵循的工作流程是什么?您如何决定是否需要 destroy

在我看来,那将是非常不标准的。 Terraform destroy 仅在您想要完全擦除基础架构的情况下使用。 Terraform 的最大特点之一是它可以对所需基础设施和现有基础设施进行智能增量,并且只进行所需的更改。通过执行 refreshplanapply,您可以确保 terraform:

  1. refresh - 对您当前的基础架构有最新的了解。如果在 terraform 脚本之外手动更改任何内容,这一点很重要。
  2. plan - 准备一个列表供您查看 terraform 打算修改或删除(或保留)的内容。
  3. apply - 执行计划中列出的更改。

通过按顺序执行这 3 个命令,terraform 将仅按要求的顺序执行必要的更改,以使您的环境与对 terraform 文件的任何更改保持一致。

我发现 destroy 有用的地方是在非生产环境中,或者在您执行侵入性如此之大以至于从头开始可以确保构建更安全的重组的情况下。

*还有一些边缘情况,Terraform 可能无法理解正确的操作顺序(我是先修改安全组还是安全组规则?),或者它会发现自己处于依赖循环中,并且会无法执行操作。然而,在那些情况下,运行ning destroy 是一个核解决方案。通常,我会手动执行问题更改(通过命令行或 AWS 控制台,如果我在 AWS 中),以推动它,然后 运行 a refreshplan , apply 重回正轨的顺序。

@mwielbut 的回答后有更多评论。

而不是选项 apply + destroy,你需要 运行 terraform 和选项 taint + apply

通常我们根本不需要 运行 terraform destroy。这是一个非常危险的选择,尤其是对于生产环境。

使用选项 planapply,用代码更新基础设施就足够了。

但是如果你确实需要销毁一些资源并重新构建一些已经创建的东西,你可以使用 taint 的选项,这是你问题的正确答案,它非常重要并且在@mwielbut 的回答中遗漏了。

The terraform taint command manually marks a Terraform-managed resource as tainted, forcing it to be destroyed and recreated on the next apply.

This command will not modify infrastructure but does modify the state file in order to mark a resource as tainted. Once a resource is marked as tainted, the next plan will show that the resource will be destroyed and recreated and the next apply will implement this change.

参考:

命令污点: https://www.terraform.io/docs/commands/taint.html

选项示例tainthttps://www.terraform.io/docs/modules/usage.html

您始终可以手动销毁您的实例,只需 运行 关闭您的 terraform apply。然后,当您 运行 terraform apply 时,它将创建没有 terraform destroy.

的全新实例

terraform destroy之前不需要terraform apply.

您的 Terraform 配置(*.tf*.tfvars 文件)描述了您的基础设施的理想状态。它说 "this is how I want my infrastructure to be."

您使用 terraform 工具来规划和应用更改,以使您的基础架构达到您描述的所需状态。您可以在不破坏任何东西的情况下逐步进行这些更改。

典型的工作流程可能是:

  • 更改 .tf.tfvars 个文件
  • 刷新状态
  • 计划变更
  • 审查计划的更改
  • 应用这些更改

如果您想完全摧毁该基础设施,您可以使用 terraform plan -destroy 来查看 Terraform 打算摧毁什么。如果你对此感到满意,那么你可以使用 terraform destroy 来摧毁它。

通常情况下,destroy 很少使用,除非您是为临时目的(例如,构建)配置基础设施或测试您使用不同参数从零开始配置的能力。即使那样,您也可以在资源上使用 count 参数,通过增加计数来临时配置资源,然后在不再需要时再次减少它。

Terraform destroy 会销毁所有资源,如果您想应用增量更改则不需要。 Destroy 只应在您想要破坏整个基础设施时使用。

申请前无需使用销毁命令。只要您在测试期间,您就可以使用销毁命令或销毁完整的基础设施您可以使用销毁命令

您可以使用以下流程

terraform init terraform plan terraform apply

如果您在状态文件中进行了任何需要更新的手动更改,请使用以下命令更新状态文件。

Terrafrom refresh

您不需要 运行 terraform destroy 。如果您对基础架构进行了任何更改,[添加/删除了资源],接下来 terraform plan & terraform apply,这些更改将自动反映出来

Terraform apply 总是刷新 Terraform 状态,所以如果你改变了什么,它会自动识别这些变化,假设你已经更新了你的 NSG 规则,添加了新的 VM,删除了旧的 VM,所以当你 运行 terraform 再次应用,您的旧状态会更新为您 Added/Updated/Deleted.

的新状态

如果你使用terraform destroy,它只会杀死整个状态,如果你是运行宁地形应用

只有当你认为你只是想降低你的基础设施而你并不真正需要时,你才需要使用 terraform destroy它。

对于添加组件、更新规则、删除其他内容等小到大的更改,您可以使用计划并应用,没有任何问题.

根本就没有。

您不需要 运行 terraform apply 之前 terraform destroyو 您的地形 (.tf) 文件描述了您的基础设施的状态。

terraform apply 始终刷新您的基础架构。它识别基础设施的状态并对其进行更新。

terraform destroy 唯一的用途是降低并彻底清除您的基础设施。 (使用前要三思)可以使用terraform plan and terraform refresh来保证基础设施的状态。

没有!当您需要修改资源时,您不需要 运行 terraform destroy!这就是 Infra-as-Code 的美妙之处。

这里有一些关于 Terraform init、plan、apply 和 destroy 的更多细节 -

  1. terraform init 命令用于初始化包含 Terraform 配置文件的工作目录。这是在编写新的 Terraform 配置或从版本控制克隆现有配置后应该是 运行 的第一个命令。多次运行这个命令是安全的。

  2. terraform plan 命令创建一个执行计划。默认情况下,创建计划包括: a) 读取任何已存在的远程对象的当前状态以确保 Terraform 状态是最新的。 b) 将当前配置与先前状态进行比较并注意任何差异。 c) 提出一组更改操作,如果应用,应该使远程对象与配置匹配。

  3. terraform apply 命令执行 Terraform 计划中建议的操作。 (您可以在没有计划的情况下进行申请,但这不是最佳做法)

  4. terraform destroy 命令是销毁由特定 Terraform 配置管理的所有远程对象的便捷方式。

核心 Terraform 工作流程: 核心 Terraform 工作流有五个步骤:

编写-作者基础设施即代码。

Terraform init - 它会自动下载合作伙伴和社区提供程序并将其直接安装到本地磁盘,以便其他命令可以使用它 Plugin_Installation, Backend_Initialization、ChildModule_Installation 以及社区和第三方插件

Terraform 计划 - 应用前预览更改。

Terraform 应用 - 提供可复制的基础设施。

Terraform 破坏 - 它会破坏你的基础设施。