9
votes

Comment créer un Terraform avec une instruction if, else, elsif?

Je mets en place un module terraform pour créer un cluster aurora.
J'ai besoin d'une option pour la réplication interrégionale, donc je dois décider de la région de la réplique par rapport à la région source.
Existe-t-il un moyen de créer une option conditionnelle multiple dans terraform?


0 commentaires

5 Réponses :


2
votes

Il n'y a pas de si / elseif / else dans Terraform <0,12

Cependant, vous pouvez utiliser la logique booléenne classique dans les conditions Terrafom


0 commentaires

12
votes

C'est une façon d'utiliser la fonction coalesce ():

locals{
  prod = "${var.environment == "PROD" ? "east" : ""}"
  prod2 = "${var.environment == "PROD2" ? "west2" : ""}"
  nonprod = "${var.environment != "PROD" && var.environment != "PROD2" ? "west" : ""}"
  region = "${coalesce(local.prod,local.prod2, local.nonprod)}"
}


0 commentaires

4
votes

Vous pouvez simplement essayer d'utiliser une map et une lookup . Exemple:

/* In your variables.tf */
variable "region_mapping" {
  description = "mapping for cross-region replication"
  default = {
    "us-east-1" = "us-east-2",
    "us-west-1" = "us-west-2"
  }
}

/* Then create use lookup to get the replication region from the deployment region */
resource "example" "example" {
  region = "${lookup(var.region_mapping, var.region)}"
}

Si var.region est l'endroit où vous avez déployé votre cluster actuel et que sa valeur est par exemple us-east-1 , la recherche renverra us-east-2 comme région dans laquelle vous devez déployer votre réplica.

Adaptez cela à vos besoins.


1 commentaires

Cela aide, je finis par utiliser la liste au lieu de la carte dont j'ai besoin de count.index pour trouver la valeur, merci @Esteban Garcia



1
votes

À partir de terraform 0.12, vous pouvez simuler un commutateur en utilisant des cartes, par exemple

locals {
  parts_map = {
    # NB Location should always be last to ensure geo-separation of names
    prefix = [ local.type.code, var.name, var.role, var.environment, module.location.code ]
    suffix = [ var.name, var.role, var.environment, local.type.code, module.location.code ]
    mode3  = [ var.name, local.type.code, var.role, var.environment, module.location.code ]
}

parts = compact(local.parts_map[local.type.order])

L'avantage de ceci est que si le résultat est plus complexe, vous pouvez renvoyer des objets / listes à partir de la carte, plutôt que de simples chaînes.

Par exemple, j'ai un module de dénomination centralisé qui compose le nom selon différentes règles basées sur le type de ressource, etc.

locals {
  environments = {
    prod = "east",
    prod2 = "west2"
  }
  
  region = lookup(environment_region, lower(var.environment), "west")
}


0 commentaires

1
votes
locals {
  test = {
    for i in list : 
      key => "${ condition ? value : (elif-condition ? elif-value : else-value)}"
  }
}

0 commentaires