Terraform działa na poziomie folderu, ciągnąc w każdym .tf
plików (i przez domyślnie plik terraform.tfvars
).
Tak więc robimy coś podobnego do Anton 's answer, ale pozbędziemy się pewnej złożoności wokół szablonów z sed.Więc jako podstawowy przykład struktury może wyglądać następująco:
$ tree -a --dirsfirst
.
├── components
│ ├── application.tf
│ ├── common.tf
│ ├── global_component1.tf
│ └── global_component2.tf
├── modules
│ ├── module1
│ ├── module2
│ └── module3
├── production
│ ├── customer1
│ │ ├── application.tf -> ../../components/application.tf
│ │ ├── common.tf -> ../../components/common.tf
│ │ └── terraform.tfvars
│ ├── customer2
│ │ ├── application.tf -> ../../components/application.tf
│ │ ├── common.tf -> ../../components/common.tf
│ │ └── terraform.tfvars
│ └── global
│ ├── common.tf -> ../../components/common.tf
│ ├── global_component1.tf -> ../../components/global_component1.tf
│ ├── global_component2.tf -> ../../components/global_component2.tf
│ └── terraform.tfvars
├── staging
│ ├── customer1
│ │ ├── application.tf -> ../../components/application.tf
│ │ ├── common.tf -> ../../components/common.tf
│ │ └── terraform.tfvars
│ ├── customer2
│ │ ├── application.tf -> ../../components/application.tf
│ │ ├── common.tf -> ../../components/common.tf
│ │ └── terraform.tfvars
│ └── global
│ ├── common.tf -> ../../components/common.tf
│ ├── global_component1.tf -> ../../components/global_component1.tf
│ └── terraform.tfvars
├── apply.sh
├── destroy.sh
├── plan.sh
└── remote.sh
Tutaj można uruchomić plan/zastosowanie/zniszczyć z poziomu głównego, w którym skrypty shell wrapper obsłużyć rzeczy jak cd'ing do katalogu i działa terraform get -update=true
ale również do folderu, aby uzyskać terraform init
, aby uzyskać unikalny klucz pliku stanu dla S3, umożliwiający śledzenie stanu każdego folderu niezależnie.
Powyższe rozwiązanie ma ogólne moduły, które zawijają zasoby w celu zapewnienia wspólnego interfejsu dla rzeczy (na przykład nasze instancje EC2 są oznaczone w określony sposób w zależności od niektórych zmiennych wejściowych i mają prywatny rekord Route53), a następnie "zaimplementowane komponenty ".
Te komponenty zawierają pakiet modułów/zasobów, które Terraform zastosuje w tym samym folderze. Możemy więc umieścić ELB, niektóre serwery aplikacji i bazę danych pod numerem application.tf
, a następnie dowiązanie symboliczne do lokalizacji daje nam jedno miejsce do kontrolowania za pomocą Terraform. Tam, gdzie możemy mieć pewne różnice w zasobach dla danej lokalizacji, zostaną one oddzielone. W powyższym przykładzie widać, że staging/global
ma wartość global_component2.tf
, której nie ma w produkcji. Może to być coś, co stosuje się tylko w środowiskach nieprodukcyjnych, takich jak niektóre funkcje kontroli sieci, aby uniemożliwić dostęp do Internetu.
Prawdziwa zaleta polega na tym, że wszystko jest łatwo dostępne bezpośrednio dla programistów, a nie ma etapu tworzenia szablonów, który zapewnia kod Terraform.
Pomaga także śledzić proces DRY, w którym jedyne rzeczywiste różnice między środowiskami występują w plikach terraform.tfvars
w lokalizacjach i ułatwiają testowanie zmian przed ich aktywacją, ponieważ każdy folder jest prawie taki sam jak inny.
Przy takim podejściu działałbyś terraform wewnątrz każdego folderu lub z katalogu głównego? Pytam, ponieważ w zależności od tego pliki stanu mogą być przechowywane w ścieżce głównej lub w każdym folderze. –
Nie można uruchomić Terraform z folderu nadrzędnego. Terraform działa tylko z tym, co znajduje się w bieżącym katalogu. Tak się składa, że mamy kilka skryptów pomocniczych, które są w katalogu głównym repo, które 'cd' w lokalizacji, na której chcemy działać, a następnie uruchamiają komendy' terraform' CLI. – ydaetskcoR
Tak, mogę, robię to przez cały czas ... 'ścieżka planu terraform/to/coś' –