【问题标题】:Terraform to create multiple vpc by re-executing same main.tfTerraform 通过重新执行相同的 main.tf 创建多个 vpc
【发布时间】:2019-03-30 19:53:43
【问题描述】:

我正在尝试创建一个 terraform 脚本,该脚本将创建一个 vpc 和其他资源。我正在从 .tfvars 文件传递​​脚本的参数。我已经通过执行脚本成功地创建了 vpc 和资源。现在我想创建另一个具有相同资源集但具有不同参数值集的 vpc。我创建了一个具有新值的新 .tfvars 文件,并尝试使用旧的 main.tf 文件执行它。当我执行“terraform plan”命令时,它显示它将删除 vpc,并且在我第一次运行期间创建的资源将创建一个具有新值的新 vpc。 有什么方法可以使用相同的 terraform main.tf 文件并通过更改 .tfvars 文件来创建资源。

【问题讨论】:

    标签: amazon-web-services terraform terraform-provider-aws iaas


    【解决方案1】:

    实现这一点的方法是创建一个模块。您应该几乎可以将当前代码剪切/粘贴到您的模块中。您可能只需要从模块中删除提供程序定义。然后在您的新主代码(根模块)中为您要创建的每组资源引用该模块。

    啊,TF 试图删除您已经创建的资源的原因是因为它们已在其状态下被捕获。

    当您创建模块时,将您已经创建的资源添加回来。TF 将始终按照代码尝试和配置,如果资源被删除,它将尝试销毁它们

    Create a module in terraform

    【讨论】:

      【解决方案2】:

      您遇到了基于状态的问题。当你定义一个资源时,你给它一个名字。这些名称在状态文件中使用,这就是让 Terraform 认为您正在尝试更改现有资源的原因。你有几种方法可以解决这个问题,这取决于你真正在做什么。

      Terraform 工作区

      您可以在 terraform 中为您正在创建的每个 VPC 使用工作区,这将使状态保持分离,但是,工作区实际上旨在分离环境,而不是同一环境中的多个资源。你可以阅读更多here

      地形模块

      在我看来,您确实想为您的 VPC 配置创建一个 terraform 模块。然后在同一个 main.tf 中使用您的模块创建每个 VPC。这样,您将拥有不会混淆状态管理的唯一名称资源。您可以阅读更多关于模块here 的信息。可以在此blog 帖子中找到有关它的信息的好资源。

      【讨论】:

      • 我已经在使用模块来创建 aws 资源,我已经使用你提到的工作区解决了这个问题。我为每个 vpc 及其相关资源创建了不同的工作区。现在可以执行我的 terraform 脚本,而 tfstate 文件之间没有任何冲突。
      【解决方案3】:

      这是因为您正在处理同一个 tfstate 文件。

      您可以执行以下操作: 1. 如果您使用本地状态:将整个代码复制到不同的目录并使用新的 tfvars 文件并在那里工作。这将启动一个新的干净 tfstate

      1. 如果您使用远程状态: a. 配置不同的远程状态,然后使用新的 tfvars 文件,或者 b. 创建一个不同的目录,将你的代码符号链接到这个目录,并用新的替换旧的后端配置和 tfvars 文件。 我有使用多环境 https://github.com/pradeepbhadani/tf-course/tree/master/Lesson5 的示例代码

      2. 为您的 VPC 代码创建一个 Terraform 模块,然后从单独的目录中调用它。

      【讨论】:

        猜你喜欢
        • 2021-05-24
        • 2021-12-14
        • 2018-07-29
        • 1970-01-01
        • 2020-01-08
        • 2022-07-01
        • 1970-01-01
        • 2021-04-07
        • 1970-01-01
        相关资源
        最近更新 更多