2017-10-06 59 views
0

Terraform v0.10.7模块的Terraform远程状态配置

我正在为我们的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基础架构,并将在S3中的指定位置存储该env的terraform.tfstate。

所以问题是,将terraform.tfstate环境中使用的所有模块也将生成并推送到S3(单一适用于env)? 我还没有跑terraform apply到任何模块。

正如我必须使用一些数据来自S3,并在同一时间这些模块的terraform.tfstate要避免给多个适用于这些模块和环境给予单terraform apply的计划。这怎么能实现?

回答

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 /网络层,数据库/弹性缓冲层,应用程序层。所以你可以对堆栈资源进行相应的分组。

+0

感谢您的详细解答!但是如果没有main.tf,env会运行什么?任何env的'main.tf'文件都将包含所有具有源代码的模块。因此,对于envs来说''main.tf'只会包含模块列表(不同于模块的其他'main.tf')。 是的,我正在使用AWS,我希望S3作为后端。但是Terraform中存在的错误不允许将S3配置为后端,在'terraform init'期间,它表示“InvalidClientTokenId”,尽管它是root用户。 –

+0

请确保您正确设置AWS API密钥(https://www.terraform.io/docs/providers/aws/) – BMW

+0

严重地先生?您如何认为我没有正确设置AWS API密钥就达到了目标?有关未解决的问题,请参阅Terraform Git。如果有任何问题,我会请求解决。 (https:// github。com/terraform-providers/terraform-provider-aws/issues/663#issuecomment-334495683) –