web-dev-qa-db-fra.com

Fournisseur Terraform / partage de variables dans les modules

Existe-t-il un moyen d'abstraire le fournisseur pour tous les modules définis dans un projet.

par exemple, j'ai ce projet

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

et ça marche bien ... le problème est avec la définition des modules

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

le fournisseur de ces deux modules est exactement le même

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

et les variables de chaque module sont différentes mais elles ont toutes la variable region.

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

existe-t-il un moyen de définir ces bits d'informations au niveau des modules afin que je me retrouve avec quelque chose comme ça

├── 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

une dernière chose, les définitions de modules ont la plupart du temps un attribut de ressource (extraire un module du registre terraform ... donc je ne sais pas s'il est possible d'hériter à la fois la source du registre et un module de base)

11
a14m

Pour l'instant, il n'est pas possible d'y parvenir. Il y a eu des discussions précédentes sur github sur le même sujet dans les numéros suivants:

TL; DR
le partage des variables entre les modules est contraire aux principes de clarté/explicité du noyau terraform.

Solution
Une solution de contournement consiste à avoir le *shared* fichiers dans le répertoire parent et en utilisant des liens symboliques pour les ajouter aux modules.

4
a14m

Si vous savez terragrunt , cela ne posera aucun problème.

Terragrunt est un wrapper mince pour Terraform qui fournit des outils supplémentaires pour travailler avec plusieurs modules Terraform.

Il est conçu pour le problème que vous venez de rencontrer.

account
 └ _global
 └ region
    └ _global
    └ environment
       └ resource

Démarrage rapide

Consultez le référentiel terragrunt-infrastructure-modules-example et terragrunt-infrastructure-live-example pour un exemple de code pleinement fonctionnel qui illustre ces fonctionnalités

vous pouvez utiliser prod/terraform.tfvars ou prod/account.tfvars pour les variables globales ou placez le fichier tfvars sous _global dossier.

2
BMW

Vous pouvez extraire les paramètres du fournisseur d'un module en passant un alias de fournisseur à utiliser. Cela vous permet de créer un module sans référence à des éléments tels que Région, puis de transmettre ces détails lors de l'invocation.

Pour votre cas d'utilisation, vous pouvez définir des fournisseurs aliasés dans vos dossiers de pile (il est préférable de le définir dans un fichier et de créer des liens symboliques pour chaque dossier de pile):

# 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"
}

Ensuite, lorsque vous appelez les modules, transmettez l'alias de fournisseur que vous souhaitez utiliser (cela suppose qu'un module utilise uniquement 1 de tout type de fournisseur particulier):

# 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"
  }
}
1
Eric M. Johnson