Terraform 通过重新执行相同的 main.tf 创建多个 vpc

Terraform to create multiple vpc by re-executing same main.tf

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

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

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

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

Create a module in terraform

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

Terraform 工作区

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

Terraform 模块

在我看来,您真的想为您的 VPC 配置创建一个 terraform 模块。然后在相同 main.tf 中使用您的模块创建每个 VPC。这样您将拥有不会混淆状态管理的唯一名称资源。您可以阅读有关模块的更多信息 here. A good resource for information about it can be found in this blog post.

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

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

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

  2. 的示例代码
  3. 创建 VPC 代码的 Terraform 模块,然后从单独的目录调用它。