我的terraform根目录中有3个.tf文件:
我只想部署运行类似以下内容的vpc.tf:
terraform apply vpc.tf #here, vpc.tf is a terraform file
但是它不起作用(我收到Go错误:“ zip:无效的zip文件”)。 如果我只是运行
terraform apply
它将尝试在所有3种terraform文件(vpc.tf,subnets.tf和instance.tf)中应用所有配置,这不是我想要的。 看来,解决此问题的方法是,拥有一个完全不同的文件夹,然后运行类似的
terraform apply vpc/ #here, vpc/ is a folder that containers vpc.tf file
有效。这种方法的问题是,如果我在vpc /文件夹中有2个或更多terraform文件,我将再次回到第一个问题。 看来解决方案是在特定的文件夹中拥有特定的资源,但这似乎并不干净,因为我可以预见,如果基础架构不断发展,我最终将得到几个包含一些terraform文件的文件夹。 所以问题是:
是否可以“地形应用”特定的terraform文件,而忽略文件夹中的所有其余文件?我是否缺少有关terraform的基本知识?
答案 0 :(得分:3)
虽然您可以使用manojlds' answer中所述的-target
来定位每次要针对的特定资源,但这意味着您可以在遇到一些奇怪的事情并且需要忽略将应用于该区域其他资源的更改。
在Terraform documentation for -target
中直接提到了这一点:
此定位功能是在特殊情况下提供的, 例如从错误中恢复或解决Terraform 局限性。不建议将-target用作例程 操作,因为这可能导致无法检测到的配置漂移和 关于资源的真实状态如何与之混淆 配置。
相反,您应该考虑将哪些内容作为集合进行更改并将.tf
Terraform文件作为一个整体进行更改,并将它们放置在同一目录中,并为它们使用相同的状态文件。
如果您不希望同时更改两项内容(例如,设置VPC以及设置该VPC中存在的应用程序或设置应用程序的测试和生产版本),则应在不同的目录中并使用不同的状态文件。
这提供了很好的分离效果,最大程度地减小了爆炸半径,但仍然使同时应用相关的大块内容更加容易。
在您的特定情况下,我会质疑为什么您不希望同时应用VPC和子网,因为通常只将其视为运行所需的基本网络配置的一部分。通常会很有意义,并且可以让您执行以下操作,例如更改VPC的名称以及在同一apply
中重命名子网。
答案 1 :(得分:1)
另一种解决方案无法解决您的确切需求,但可行的是使用-target
参数进行资源定位,例如:
terraform plan -target digitalocean_loadbalancer.public -out run.plan
https://www.terraform.io/docs/commands/plan.html#resource-targeting