使用模块时,Terraform根目录中variables.tf的用途是什么?

使用模块时,Terraform根目录中variables.tf的用途是什么?,terraform,devops,Terraform,Devops,我正在编写一些代码来描述AWS上的基础设施,并遵循Terraform最佳实践。为了使我的代码更加可重用和经得起未来考验,我使用了模块。最后,我的代码可能如下所示: ├── modules │   └── aws_vpc │   ├── main.tf │   └── vars.tf ├── prod │   ├── main.tf │   └── variables.tf ├── terraform.tfstate └── terraform.tfstate.backup 为了

我正在编写一些代码来描述AWS上的基础设施,并遵循Terraform最佳实践。为了使我的代码更加可重用和经得起未来考验,我使用了模块。最后,我的代码可能如下所示:

├── modules
│   └── aws_vpc
│       ├── main.tf
│       └── vars.tf
├── prod
│   ├── main.tf
│   └── variables.tf
├── terraform.tfstate
└── terraform.tfstate.backup
为了简单起见,我不使用terraform workspace

问题是,如果我不能在模块中重用它们,
variables.tf
和Terraform
根目录的作用是什么

想法是为每个环境
dev
prod
qa
建立单独的目录,我可以重用
modules
目录中定义的所有模块,并使用
env
目录中定义的特定于环境的变量

在这方面也有类似的讨论,但正如我所看到的,这种使用是不受鼓励的

那么,如果我以后不能在模块中重用Terraform根目录中的
variables.tf
,那么它的用途是什么呢

我知道有一个Terragrunt作为一个包裹在Terraform周围的东西,但我只想坚持使用Terraform

在任何给定的Terraform目录中,我不认为任何
.tf
文件具有任何特定的功能,除了让您了解如何分解资源和/或安排代码之外。因此,
main.tf
variables.tf
可以合并到一个文件中,而不会丢失任何功能

在您的设置中,
变量.tf
将有一组变量,每个变量都有一个
默认值(或者
terraform x
命令将提示输入它们的值)。或者,您可以省略
默认值
而创建一个
terraform.tfvars
文件,为每个变量设置值

在这个为每个环境(prod、test、dev等)提供单独dir的设置中,我更喜欢使用
terraform.tfvars
,因为我发现做diff比较容易,而且我知道我只需要修改
terraform.tfvars
文件

例如,
cidr\u block
可能是为每个env指定的变量,然后传递到
aws\u vpc
模块。prod可能为192.168.0.0/16,而test可能为10.1.0.0/16


至于模块,尽管看起来所有的变量都是重复的/与环境dirs中的代码重复的,但它不是给定的。例如,您的env代码中可能有一个布尔值,该布尔值作为输入传递到模块中,然后模块使用该输入做出某些“决策”。

模块具有输入和输出。您可以多次调用该模块,但每次都必须提供所需的输入。。。您不能简单地依赖于调用上下文中设置的变量(尽管您可以将这些值作为参数传入)

将模块视为函数,而不是包含。你必须传递参数。模块无权访问全局范围。这通常是一个很好的编程实践。。。全局变量会导致意大利面代码和意外后果。一些好的读物

您的模块正在由环境目录
/prod/
中的Terraform代码调用,该目录本身在
/prod/variables.tf
中具有
变量
声明。由于您要为每个环境创建一个目录,因此在该顶层共享数据或资源的唯一方法是复制/粘贴,或者像这样对文件进行符号链接:

├── modules
│   └── aws_vpc
│       ├── main.tf
│       └── vars.tf
├── prod
│   ├── global_variables.tf (symlink from ./shared/global_variables.tf)
│   ├── main.tf
│   └── variables.tf
├── shared
│   └── global_variables.tf
├── terraform.tfstate
└── terraform.tfstate.backup

请注意,除非您确实希望在运行时使用
-var
-var file
更改这些值,否则您可能确实希望使用。我以前使用带有默认值的变量而不是局部变量,但如果该值在该环境下永远不会更改,则使用局部变量是有意义的。

请查看此回购协议以供参考。您的示例令人困惑。您认为TrRAFFATE <代码>根>代码>目录在这里,<代码> //<代码>或<代码> /PROD/<代码>?@ ErICM.Jordon,取决于您要创建的Env类型,假设您想为开发环境提供infra,根目录将是./prod,而开发帐户将是./dev.Modules。主要目的是重用代码。@karansharma混淆的是variables.tf在
/prod
中,而
terraform.tfstate
//code>中,这表明Terraform是从
/
运行的。