我正在尝试创建一个Terraform脚本,该脚本将创建一个vpc和其他资源。我正在从.tfvars文件传递脚本的参数。我已经通过执行脚本成功创建了vpc和资源。现在,我想创建另一个具有相同资源集但具有不同参数值集的vpc。我用新值创建了一个新的.tfvars文件,并尝试使用旧的main.tf文件执行它。当我执行“ 地形计划”命令时,它显示将删除vpc,并且在我的第一次运行中创建的资源将使用新值创建一个新的vpc。 是否有任何方法可以使用相同的Terraform main.tf文件并通过更改.tfvars文件来创建资源。
答案 0 :(得分:2)
方法是通过创建一个模块。您应该能够将当前代码剪切/粘贴到模块中。您可能只需要从模块中删除提供程序定义。然后,在新的主代码(根模块)中,为要创建的每组资源引用该模块。
这是TF尝试删除您已经创建的资源的原因,是因为它们已在其状态下被捕获。
创建模块时,请添加已创建的资源。TF将始终按照代码进行尝试和配置,如果删除了资源,它将尝试并销毁它们
答案 1 :(得分:2)
您遇到了基于状态的问题。定义资源时,请为其命名。这些名称在状态文件中使用,这就是Terraform认为您正在尝试更改现有资源的原因。您可以通过几种方法解决此问题,这取决于您的实际工作。
平台工作区
您可以为要创建的每个VPC在terraform中使用工作空间,这样可以使状态保持分离,但是,工作空间实际上是用于分隔环境的,而不是同一环境中的多个资源。您可以阅读更多here。
Terraform模块
在我看来,您真的想为VPC配置创建terraform模块。然后,使用同一main.tf中的模块创建每个VPC。这样,您将拥有唯一的名称资源,而不会混淆状态管理。您可以阅读有关模块here的更多信息。可以在此blog帖子中找到很好的信息资源。
答案 2 :(得分:2)
这是因为您正在使用同一tfstate文件。
您可以执行以下操作: 1.如果使用的是本地状态,请执行以下操作:将整个代码复制到另一个目录中,并复制新的tfvars文件,然后在此处运行。这将启动一个新的干净的tfstate
如果您正在使用远程状态:
a.
配置不同的远程状态,然后使用新的tfvars文件,或者
b.
创建一个不同的目录,将代码符号链接到该目录,并用新目录替换旧的后端配置和tfvars文件。
我有使用多环境https://github.com/pradeepbhadani/tf-course/tree/master/Lesson5
创建VPC代码的Terraform模块,然后从单独的目录中调用它。