2017-10-06 2 views
0

Terraforming v0.10.7Terraforming Fernzustandskonfiguration für Module

ich in einem Prozess am Zusammen setzen Terraforming-Module für unser DevOps Team. Es wird separate Module für jede Komponente geben, die wir verwenden, und wiederum wird ein vollständiger Stapel mit diesen Modulen für unterschiedliche Umgebungen und Anforderungen erstellt.

Die Verzeichnishierarchie ist wie folgt:

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) 

In backend.tf Ich habe angegeben Backend als S3 und eine komplette Hierarchie als /resources/mod-1/terraform.tfstate. Dasselbe gilt für backend.tf in Umgebungen.

Als ich terraform get und terraform apply für jede Umgebung geben, wird es alle Module angegeben holen und die Änderungen an AWS-Infrastruktur anwenden und es wird terraform.tfstate dieser env an der angegebenen Stelle in S3 speichern.

Also die Frage ist, wird die terraform.tfstate für alle Module in der Umgebung verwendet werden auch generiert und auf S3 (mit single gelten für env) geschoben werden? Ich habe terraform apply nicht zu irgendwelchen Modulen laufen lassen.

Wie ich habe einen Plan, einige Daten aus terraform.tfstate verwenden dieser Module von S3 und zur gleichen Zeit mehrere vermeiden wollen geben zu diesen Modulen gilt und einzelne terraform apply zur Umgebung zu geben. Wie kann dies erreicht werden?

Antwort

0

Erstens, ich glaube nicht, dass Sie die gleichen *.tf Dateien für jede Umgebung neu schreiben müssen. Also für jede Anwendung, abhängig davon, welche Module bezogen werden, sollten Sie unter Dateistrukturen haben:

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) 

in /backend.conf, können Sie das s3 Backend definieren (wenn Sie aws verwenden)

bucket = "<global_unique_bucket_name>" 
key  = "<env>/network.tfstate" 
region = "us-east-1" 
kms_key_id = "alias/terraform" 
encrypt = true 

Zweitens sollte kein Backend für jedes Modul benötigt werden (wenn mein Verständnis richtig ist, wird das Backend verwendet, um tfstate file zu speichern). Die Backend-Datei sollte in jeder Umgebung sein, wie ich oben aufgelistet habe.

Drittens sollte die Datei *.tfstate in jeder Umgebung definiert werden. Ich habe das obige Beispiel in <env>/backend.conf

gegeben. Dann haben wir Serverschichten, um Terraformstapel, VPC-/Netzschicht, Datenbank-/elasticache Schichten, Anwendungsschichten zu handhaben. So können Sie die Stack-Ressource entsprechend gruppieren.

+0

Danke für die ausführliche Antwort! Aber ohne main.tf für ein env was wirst du laufen? 'main.tf' Datei für irgendein env hat alle Module mit Quelle. Also 'main.tf' für envs wird nur eine Liste von Modulen haben (anders als andere' main.tf' von Modulen). Ja, ich verwende AWS und ich möchte S3 als Backend. Aber es gibt einen Fehler in Terraform, der es nicht erlaubt, S3 als Backend zu konfigurieren und während 'terraform init' heißt es' InvalidClientTokenId', obwohl es root-Benutzer ist. –

+0

stellen Sie bitte sicher, dass Sie den AWS API-Schlüssel richtig gesetzt haben (https://www.terraform.io/docs/providers/aws/) – BMW

+0

Ernsthaft, Sir? Wie denkst du, dass ich zu diesem Zeitpunkt erreicht habe, ohne AWS API Keys richtig zu setzen? Bitte konsultieren Sie Terraform Git für offene Probleme. Ich fragte nach Arbeit, wenn überhaupt. (https: // github.com/terraform-providers/terraform-provider-aws/issues/663 # issementcomment-334495683) –