使用模块时,Terraform根目录中variables.tf的用途是什么?
我正在编写一些代码来描述AWS上的基础设施,并遵循Terraform最佳实践。为了使我的代码更加可重用和经得起未来考验,我使用了模块。最后,我的代码可能如下所示:使用模块时,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 为了
├── 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是从/
运行的。