模块的Terraform远程状态配置

时间:2017-10-06 06:57:17

标签: amazon-web-services amazon-s3 terraform

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 getterraform apply时,它将获取指定的所有模块,并将更改应用于AWS基础架构,并将该env的terraform.tfstate存储在指定位置S3。

所以问题是,环境中使用的所有模块的 terraform.tfstate 是否也会生成并推送到S3(单个应用于env)? 我还没有terraform apply运行任何模块。

由于我计划使用来自S3的那些模块的 terraform.tfstate 中的一些数据,同时又希望避免多次应用这些模块并提供单terraform apply对环境。如何实现这一目标?

1 个答案:

答案 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 /网络层,数据库/弹性层,应用层。因此,您可以相应地对堆栈资源进行分组。