web-dev-qa-db-fra.com

Terraform combine 2 variables en une nouvelle variable

Je souhaite automatiser les déploiements de VM VMware dans un paysage avec de nombreux groupes de ports. Pour pouvoir sélectionner le groupe de ports correct, il est préférable d'entrer 2 locataires et environnement variables. Ces 2 variables sont utilisées à des fins d'enregistrement et de déploiement CMDB.

Pour le déploiement, les variables doivent être combinées en une nouvelle variable pour choisir le groupe de ports correct. En raison de la syntaxe d'interpolation, il semble impossible d'utiliser 2 variables combinées dans la recherche.

Comment combiner 2 variables à 1 dans Terraform?

J'ai également essayé de créer un fichier local avec la chaîne correcte, mais ce fichier doit exister avant le démarrage du script, le plan terraform affiche un message d'erreur indiquant que le fichier n'existe pas.

variable "tenant" {
  description = "tenant: T1 or T2"
}

variable "environment" {
  description = "environment: PROD or TEST"
}

variable "vm_network" {
  description = "network the VM will be provisioned with"
  type = "map"
  default = {
    T1_PROD = "T1-PROD-network"
    T2_PROD = "T2-PROD-network"
    T1_TEST = "T1-TEST-network"
    T2_TEST = "T2-TEST-network"
  }
}

data "vsphere_network" "network" {
  name          = "${lookup(var.vm_network, tenant_environment)}"
  datacenter_id = "${data.vsphere_datacenter.dc.id}"
}
5
Dennis

Du haut de ma tête, je peux penser à trois façons différentes de fusionner les variables à utiliser comme clé de recherche:

variable "tenant" {}
variable "environment" {}

variable "vm_network" {
  default = {
    T1_PROD = "T1-PROD-network"
    T2_PROD = "T2-PROD-network"
    T1_TEST = "T1-TEST-network"
    T2_TEST = "T2-TEST-network"
  }
}

locals {
  tenant_environment = "${var.tenant}_${var.environment}"
}

output "local_network" {
  value = "${lookup(var.vm_network, local.tenant_environment)}"
}

output "format_network" {
  value = "${lookup(var.vm_network, format("%s_%s", var.tenant, var.environment))}"
}

output "lookup_network" {
  value = "${lookup(var.vm_network, "${var.tenant}_${var.environment}")}"
}

La première option utilise locals pour créer une variable qui est déjà interpolée et peut être facilement réutilisée à plusieurs endroits, ce qui ne peut pas être fait directement avec des variables dans Terraform/HCL. C'est généralement le meilleur moyen de combiner/interpoler des variables dans les versions ultérieures de Terraform (elles ont été introduites dans Terraform 0.10.3).

La deuxième option utilise la fonction format pour créer une chaîne contenant les variables de locataire et d'environnement.

Le dernier est un peu drôle mais est valide HCL. Je n'hésiterais probablement pas à utiliser cette syntaxe si possible.

6
ydaetskcoR