web-dev-qa-db-fra.com

Attributs conditionnels dans Terraform

Terraform prend-il en charge les attributs conditionnels? Je veux seulement utiliser un attribut en fonction de la valeur d'une variable.

Exemple:

resource "aws_ebs_volume" "my_volume" {
  availability_zone = "xyz"
  size              = 30

  if ${var.staging_mode} == true:
    snapshot_id = "a_specific_snapshot_id"
  endif
}

L'instruction if ci-dessus contenant l'attribut snapshot_id est ce que je recherche. Terraform prend-il en charge cette inclusion d'attribut en fonction de la valeur d'une variable?.

6
Basil Musa

Terraform 0.12 (non encore publié) apportera également support pour HCL2 qui vous permet d'utiliser des arguments nullables avec quelque chose comme ceci:

resource "aws_ebs_volume" "my_volume" {
  availability_zone = "xyz"
  size              = 30
  snapshot_id       = "staging_mode ? a_specific_snapshot_id : null"
}

Les arguments nullables sont traités dans ce guide d'aperçu 0.12 .

Pour l'instant, pré 0.12, Markusréponse est probablement votre meilleur pari bien que je serais plus explicite avec le count avec quelque chose comme ceci:

resource "aws_ebs_volume" "staging_volume" {
   count=${var.staging_mode ? 1 : 0}
   availability_zone = "xyz"
   size = 30

   snapshot_id = "a_specific_snapshot_id"
}

resource "aws_ebs_volume" "non_staging_volume" {
   count=${var.staging_mode ? 0 : 1}
   availability_zone = "xyz"
   size = 30
}

Notez que les noms des ressources doivent être uniques, sinon Terraform se plaindra. Cela provoque alors des problèmes si vous devez vous référer au volume EBS, comme avec un aws_volume_attachment comme dans avant 0.12 l'expression ternaire n'est pas paresseuse donc quelque chose comme ça ne fonctionne pas:

resource "aws_volume_attachment" "ebs_att" {
  device_name = "/dev/sdh"
  volume_id   = "${var.staging_mode ? aws_ebs_volume.staging_volume.id : aws_ebs_volume.non_staging_volume.id}"
  instance_id = "${aws_instance.web.id}"
}

Parce qu'il tentera d'évaluer les deux côtés du ternaire où un seul peut être valide à tout moment. Dans Terraform 0.12, ce ne sera plus le cas, mais vous pouvez évidemment le résoudre plus facilement avec les arguments nullables.

2
ydaetskcoR

Je ne suis pas au courant d'une telle fonctionnalité, cependant, vous pouvez modéliser autour de cela, si vos cas ne sont pas trop compliqués. Étant donné que les valeurs booléennes true et false sont considérées comme 1 et 0, vous pouvez les utiliser dans un décompte. Vous pouvez donc utiliser

provider "null" {}

resource "null_resource" "test1" {
   count= ${var.condition ? 1 : 0}
}
resource "null_resource" "test2" {
   count = ${var.condition ? 0 : 1}
}

output "out" {
    value = "${var.condition ? join(",",null_resource.test1.*.id) : join(",",null_resource.test2.*.id) }"
}

Une seule des deux ressources est créée en raison de l'attribut count.

Vous devez utiliser join pour les valeurs, car cela semble gérer l'inexistence de l'une des deux valeurs avec élégance.

Merci ydaetskcor pour avoir signalé dans leur réponse les améliorations de la gestion des variables.

2
Markus