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 将始终尝试按照代码进行配置,如果资源被删除,它将尝试销毁它们
您 运行 遇到了基于状态的问题。当你定义一个资源时,你给它一个名字。这些名称在状态文件中使用,这就是让 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
如果您正在使用远程状态:
a.
配置不同的远程状态然后使用新的 tfvars 文件,或者
b.
创建一个不同的目录,将您的代码符号链接到该目录,并将旧的后端配置和 tfvars 文件替换为新的。
我有使用 multi-env https://github.com/pradeepbhadani/tf-course/tree/master/Lesson5
的示例代码
创建 VPC 代码的 Terraform 模块,然后从单独的目录调用它。
我正在尝试创建一个 terraform 脚本,它将创建一个 vpc 和其他资源。我从 .tfvars 文件传递脚本参数。我已经通过执行脚本成功创建了 vpc 和资源。现在我想创建另一个具有相同资源集但具有不同参数值集的 vpc。我创建了一个包含新值的新 .tfvars 文件,并尝试使用旧的 main.tf 文件执行它。当我执行“terraform plan”命令时,它显示它将删除在我的第一个 运行 期间创建的 vpc 和资源,将创建一个具有新值的新 vpc。 有没有什么方法可以使用相同的 terraform main.tf 文件并通过更改 .tfvars 文件来创建资源。
方法是创建一个模块。您应该能够将当前代码剪切/粘贴到您的模块中。您可能只需要从模块中删除提供者定义。然后在您的新主代码(根模块)中为您要创建的每组资源引用该模块。
啊,TF 试图删除您已经创建的资源的原因是因为它们已在其状态下被捕获。
当您创建模块时,添加您已经创建的资源。TF 将始终尝试按照代码进行配置,如果资源被删除,它将尝试销毁它们
您 运行 遇到了基于状态的问题。当你定义一个资源时,你给它一个名字。这些名称在状态文件中使用,这就是让 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
如果您正在使用远程状态:
a.
配置不同的远程状态然后使用新的 tfvars 文件,或者b.
创建一个不同的目录,将您的代码符号链接到该目录,并将旧的后端配置和 tfvars 文件替换为新的。 我有使用 multi-env https://github.com/pradeepbhadani/tf-course/tree/master/Lesson5 的示例代码
创建 VPC 代码的 Terraform 模块,然后从单独的目录调用它。