Terraform-Anbieter / Variablenfreigabe in Modulen - terraform - Program QA

Terraform-Anbieter / Variablenfreigabe in Modulen

2018-07-06 terraform terraform-provider-aws terragrunt

Gibt es eine Möglichkeit, den Anbieter für alle in einem Projekt definierten Module zu abstrahieren?

Zum Beispiel habe ich dieses Projekt

├── modules
│   ├── RDS
│   └── VPC
└── stacks
    ├── production
    │   └── main.tf
    └── staging
        └── main.tf

und es funktioniert gut ... Das Problem liegt in der Definition von Modulen

├── RDS
│   ├── README.md
│   ├── main.tf
│   ├── providers.tf
│   └── variables.tf
└── VPC
    ├── README.md
    ├── main.tf
    ├── providers.tf
    └── variables.tf

Der Anbieter in beiden Modulen ist genau der gleiche

# providers.tf
provider "aws" {
  region ="${var.region}"
  version ="~> 1.26"
}

und die Variablen in jedem Modul sind unterschiedlich , aber sie haben die ganze region unterschiedlich.

# variables.tf
variable "region" {
  default     ="eu-central-1"
  description ="AWS region."
}
# other module dependent variables...

Gibt es eine Möglichkeit, diese Informationen auf Modulebene zu definieren? so dass ich am Ende ungefähr so ​​etwas habe

├── modules
│   ├── providers.tf  <<< include the *shared* provider definition block
│   ├── variables.tf  <<< include the *shared* region vaiable definition block
│   ├── RDS
│   │   ├── README.md
│   │   ├── main.tf
│   │   └── variables.tf
│   └── VPC
│       ├── README.md
│       ├── main.tf
│       └── variables.tf

Eine letzte Sache: Die Moduldefinitionen haben meistens ein Ressourcenattribut (Abrufen eines Moduls aus der Terraform-Registrierung ... daher weiß ich nicht, ob es möglich ist, sowohl die Quelle von der Registrierung als auch ein Basismodul zu erben.)

Answers

Im Moment ist das nicht möglich. Es gab bereits Diskussionen über Github zu demselben Thema in den folgenden Ausgaben:

TL; DR
Die gemeinsame Nutzung von Variablen zwischen Modulen verstößt gegen die Prinzipien der Klarheit / Explizität des Terraform-Kerns.

Problemumgehung
Eine Problemumgehung besteht darin, die *shared* Dateien im übergeordneten Verzeichnis zu haben und sie mithilfe von Symlinks zu den Modulen hinzuzufügen.

Wenn Sie Terragrunt kennen, ist dies überhaupt kein Problem.

Terragrunt ist ein Thin Wrapper für Terraform, der zusätzliche Tools für die Arbeit mit mehreren Terraform-Modulen bietet.

Es wurde für das Problem entwickelt, bei dem Sie gerade geblieben sind.

account
 └ _global
 └ region
    └ _global
    └ environment
       └ resource

Schnellstart

In den Repos Terragrunt-Infrastructure-Module-Beispiel und Terragrunt-Infrastructure-Live-Beispiel finden Sie einen voll funktionsfähigen Beispielcode, der diese Funktionen demonstriert

Sie können prod/terraform.tfvars oder prod/account.tfvars für globale Variablen verwenden oder die Datei _global Ordner _global _global .

Sie können Anbieterparameter von einem Modul weg abstrahieren, indem Sie einen zu verwendenden Anbieteralias übergeben. Auf diese Weise können Sie ein Modul ohne Verweis auf Dinge wie Region erstellen und diese Details beim Aufruf übergeben.

Für Ihren Anwendungsfall können Sie Alias-Anbieter in Ihren Stapelordnern definieren (wahrscheinlich am besten, um dies in einer Datei zu definieren und symbolische Links für jeden Stapelordner zu erstellen):

# stacks/{staging,production}/providers.tf
provider "aws" {
  alias  ="us-east-1"
  region ="us-east-1"
}

provider "aws" {
  alias   ="us-east-2"
  region  ="us-east-2"
}

Übergeben Sie dann beim Aufrufen der Module den Provider-Alias, den Sie verwenden möchten (dies setzt voraus, dass ein Modul nur einen bestimmten Providertyp verwendet):

# stacks/{staging,production}/main.tf
module "VPC-us-east-1" {
  source ="../../modules/VPC"

  providers = {
    aws      ="aws.us-east-1"
  }
}

module "VPC-us-east-2" {
  source ="../../modules/VPC"

  providers = {
    aws      ="aws.us-east-2"
  }
}

Derzeit gibt es keine globale Variablenfunktion für die Hashicorp-Konfigurationssprache.

Und variables werden zum Definieren von Modulschnittstellen von Modulen verwendet oder wirken wie ENV-Variablen (Inline-ENV). Es ist also nicht der beste Weg, Variablen als global gemeinsam genutzte Variablen zu verwenden. Denn jedes Mal, wenn Sie einige Module definieren, müssen Sie sich überlegen, welche Variablen Sie für die oberen Module verwendet haben. Und wahrscheinlich werden Sie am Ende wie first_module_s3_bucket_name aussehen: first_module_s3_bucket_name , second_module_s3_bucket_name .

locals sind jedoch sinnvoller, wenn sie an untergeordnete Module weitergegeben werden. Weil die Einheimischen versuchen, zu vermeiden, dass der gleiche Wert wiederholt wird.

Wenn Sie interessiert sind, gibt es eine neue Diskussion zur Anforderung von Hashicorp-Funktionen.

https://github.com/hashicorp/terraform/issues/25431

Related