Terraform v0.10.7
我正在为我们的DevOps团队整合terraform模块。我们正在使用的每个组件都有单独的模块,反过来将使用这些模块创建整个堆栈,以满足不同的环境和要求。
目录层次结构如下:
Terraform
- modules
- module-1 (main.tf, vars.tf, outputs.tf, backend.tf)
- module-2 (main.tf, vars.tf, outputs.tf, backend.tf)
- module-3 (main.tf, vars.tf, outputs.tf, backend.tf)
...
- environments
- qa (main.tf, vars.tf, outputs.tf, bakend.tf)
- stage (main.tf, vars.tf, outputs.tf, bakend.tf)
- prod (main.tf, vars.tf, outputs.tf, bakend.tf)
在 backend.tf 中,我将后端指定为S3,将完整层次结构指定为/resources/mod-1/terraform.tfstate
。同样适用于环境中的backend.tf。
当我为任何环境提供terraform get
和terraform apply
时,它将获取指定的所有模块,并将更改应用于AWS基础架构,并将该env的terraform.tfstate存储在指定位置S3。
所以问题是,环境中使用的所有模块的 terraform.tfstate 是否也会生成并推送到S3(单个应用于env)?
我还没有terraform apply
运行任何模块。
由于我计划使用来自S3的那些模块的 terraform.tfstate 中的一些数据,同时又希望避免多次应用这些模块并提供单terraform apply
对环境。如何实现这一目标?
答案 0 :(得分:0)
首先,我认为您不需要为每个环境重写相同的*.tf
文件。因此,对于每个应用程序,取决于将采购哪些模块,您应具有以下文件结构:
Application-1
- modules-1.tf
- modules-2.tf
- modules-3.tf
- main.tf, vars.tf, outputs.tf
- qa (qa/backend.conf, qa/qa.tfvars)
- stag (stag/backend.conf, stag/stag.tfvars)
- prod (prod/backend.conf, stag/prod.tfvars)
在/backend.conf中,您可以定义s3后端(如果使用aws)
bucket = "<global_unique_bucket_name>"
key = "<env>/network.tfstate"
region = "us-east-1"
kms_key_id = "alias/terraform"
encrypt = true
其次,每个模块都不应该有后端(如果我的理解是正确的,后端用于保存tfstate文件)。后端文件应该在我上面列出的每个环境中。
第三,应在每个环境中定义*.tfstate
文件。我在<env>/backend.conf
然后我们有服务器层来管理terraform堆栈,VPC /网络层,数据库/弹性层,应用层。因此,您可以相应地对堆栈资源进行分组。