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?.
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.
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.