我正在考虑将我们的一些基础设施代码切换到Terraform,因为我们在AWS CloudFormation上遇到了一些麻烦。
根据我收集到的信息,有3种主要的方法来构建你的地形目录。
project
âââ modules
| ââ ecs
| âââ main.tf
| âââ variables.tf
| âââ task
| âââ main.tf
| âââ variables.tf
|
|
âââ env
| ââââ dev.tfvars
| ââââ prod.tfvars
| ââââ stage.tfvars
| ââââ 10+
|
|
|ââ main.tf
|ââ variable.tf
使用这种结构,我必须从env文件夹中获取变量,并将其传递给
-var-files="env/dev.tfvars"
2
project
âââ modules
| ââ ecs
| âââ main.tf
| âââ variables.tf
| âââ task
| âââ main.tf
| âââ variables.tf
|
|
âââ stage
| ââââ main.tf
| ââââ variable.tf
| ââââ stage.tfvars
|
âââ dev
| ââââ main.tf
| ââââ variable.tf
| ââââ dev.tfvars
|
âââ 10+
| ââââ main.tf
| ââââ variable.tf
| ââââ X.tfvars
如果希望将基于环境的变量应用于
modules/ecs/task/main.tf
,你必须从
main.tf
例如,在调用
modules/ecs/main.tf
/modules/ecs/main.tf
然后应用到
/modules/ecs/task/main.tf
这种方法的问题还在于,每当我添加一个新模块时,我都必须将它添加到所有不同环境中主.tf
三。
project
âââ modules
| âââ ecs
| âââ main.tf
| âââ variables.tf
| âââ task
| âââ main.tf
| âââ variables.tf
|
|
|
|
|ââ main.tf
|ââ variable.tf
通过使用terraform工作区,我可以在modules/ecs/task中使用局部变量/变量.tf来确定我在营造什么样的环境。这样地:
modules/ecs/task.variables.tf
locals {
env="${terraform.workspace}"
masterAccountIDS = {
"default"="12121212"
"dev"="84848484"
}
masterAccountID="${lookup(local.masterAccountIDS, local.env)}"
}
但这需要每次我添加一个新的环境时,我都要经历所有的过程变量.tf文件,并添加一个名为“stage”的新条目。
我想不出一种方法可以让我不复制粘贴代码,或者在添加新环境时不插入新内容,或者将所有内容都放在一个地方,所以我可能只需要编辑一个文件。