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) –