【问题标题】:Is terraform destroy needed before terraform apply?在应用 terraform 之前是否需要 terraform destroy ?
【发布时间】:2016-09-24 16:41:10
【问题描述】:

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

【问题讨论】:

    标签: terraform


    【解决方案1】:

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

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

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

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

    *还有一些边缘情况,terraform 可能无法理解正确的操作顺序(我是先修改安全组还是修改安全组规则?),或者它会发现自己处于依赖循环中并且无法执行操作。然而,在这些情况下,运行破坏是一种核解决方案。一般来说,我会手动执行问题更改(通过命令行或 AWS 控制台,如果我在 AWS 中),轻推它,然后运行refreshplanapply 序列以返回步入正轨。

    【讨论】:

    • 不知道刷新命令...感谢漂亮的流程解释;]
    • 在查看您的 terraform 脚本和环境时,您会发现如果继续使用 destroy,则会产生一些隐含的后果。例如,除非您在 AWS 中明确删除销毁卷,并且您正在创建实例,否则它将留下卷。虽然卷位于 AWS 中,但您需要为它们付费。
    • Terraform 旨在管理状态,仅在需要时销毁事物以实现新配置。 Plan 会自动刷新数据,向您显示更改,您可以根据需要随时运行它。总结,无论哪里表明“强制改变”,都与你有关,你正在做的事情会导致事情被重新创建而不是修改。我一直在努力学习文档并没有传达所有这些信息,但是在 GitHub 上搜索要点和问题帮助我找到了文档中没有的解决方案——包括为什么你不希望强制改变的东西.
    【解决方案2】:

    terraform apply 之前不需要terraform destroy

    您的 Terraform 配置(*.tf*.tfvars 文件)描述了您的基础架构的所需状态。它说“这就是我希望我的基础设施的样子。”

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

    典型的工作流程可能是:

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

    如果您想彻底破坏该基础设施,您可以使用terraform plan -destroy 来查看 Terraform 打算破坏什么。如果您对此感到满意,则可以使用terraform destroy 将其销毁。

    通常,destroy 很少使用,除非您为临时目的(例如构建)配置基础架构或测试您从具有不同参数的全新状态配置的能力。即使这样,您也可以在资源上使用count 参数,通过增加计数来临时配置资源,然后在不再需要时再次减少。

    【讨论】:

      【解决方案3】:

      @mwielbut 回答后的更多 cmets。

      您需要使用选项taint + apply 运行terraform,而不是选项apply + destroy

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

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

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

      terraform taint 命令手动将 Terraform 管理的资源标记为已污染,强制将其销毁并在下一次应用时重新创建。

      此命令不会修改基础架构,但会修改状态文件以将资源标记为已污染。一旦资源被标记为污染,下一个计划将显示该资源将被销毁并重新创建,并且下一个应用将实施此更改。

      参考:

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

      选项taint 的示例: https://www.terraform.io/docs/modules/usage.html

      【讨论】:

        【解决方案4】:

        Terraform destroy 会销毁所有资源,如果您想应用增量更改,则不需要它。 Destroy 应该仅在您想要销毁整个基础架构时使用。

        【讨论】:

        • 在使用 destroy 这样的东西时,也可以(或应该)以模块而不是整个基础架构为目标。 terraform destroy -target=module.<module_name> 或者最好先看看你要破坏什么terraform plan -destroy -target=module.<module_name>
        【解决方案5】:

        应用前无需使用destroy 命令。只要您处于测试阶段,您就可以使用 destroy 命令或销毁完整的基础设施,您可以使用 destroy 命令

        您可以使用以下流程

        terraform init terraform plan terraform apply

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

        Terrafrom refresh
        

        【讨论】:

          【解决方案6】:

          你不需要跑到terraform destroy 。如果您对基础架构进行了任何更改,[添加/删除资源],在下一个 terraform plan & terraform apply,更改将自动反映

          【讨论】:

            【解决方案7】:

            Terraform 应用总是刷新 Terraform 状态,因此如果您更改任何内容,它会自动识别更改,假设您已更新 NSG 规则、添加新 VM、删除旧 VM,所以当您运行时 terraform apply,您的旧状态将更新为您添加/更新/删除的新状态。

            如果你使用 terraform destroy,它只会杀死整个状态,如果你正在运行 terraform,你会回到新的状态申请

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

            对于诸如添加组件、更新规则、删除其他内容之类的次要更改,您可以毫无问题地使用计划和应用

            【讨论】:

              【解决方案8】:

              没有。

              您无需在 terraform destroyو 之前运行 terraform apply 您的 terraform (.tf) 文件描述了您的基础架构的状态。

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

              terraform destroy 唯一用途是关闭并彻底清除您的基础架构。 (使用前必须三思而后行)您可以使用terraform planterraform refresh 来确保基础架构的状态。

              【讨论】:

                【解决方案9】:

                您总是可以手动销毁您的实例,只运行您的terraform apply。然后当您运行terraform apply 时,它将创建没有terraform destroy 的全新实例。

                【讨论】:

                  【解决方案10】:

                  不!当您需要修改资源时,您不需要运行 terraform destroy !这就是基础设施即代码的美妙之处。

                  这里有更多关于 Terraform 初始化、计划、应用和销毁的详细信息 -

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

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

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

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

                  【讨论】:

                    【解决方案11】:

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

                    编写 - 将基础设施编写为代码。

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

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

                    Terraform Apply - 提供可重现的基础设施。

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

                    【讨论】:

                      猜你喜欢
                      • 2021-09-13
                      • 2018-10-01
                      • 2019-08-22
                      • 2016-12-12
                      • 2020-05-19
                      • 2021-12-02
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多