web-dev-qa-db-fra.com

Dans Terraform 0.12, comment ignorer la création d'une ressource, si le nom de la ressource existe déjà?

J'utilise la version 0.12 de Terraform. J'ai l'obligation d'ignorer la création de ressources si une ressource du même nom existe déjà.

J'ai fait ce qui suit pour cela:

Lisez la liste des images personnalisées,

data "ibm_is_images" "custom_images" {
}

Vérifiez si l'image existe déjà,

locals {
 custom_vsi_image = contains([for x in data.ibm_is_images.custom_images.images: "true" if x.visibility == "private" && x.name == var.vnf_vpc_image_name], "true")
}

output "abc" {
value="${local.custom_vsi_image}"
}

Créer uniquement si l'image existe est faux.

resource "ibm_is_image" "custom_image" {
  count            = "${local.custom_vsi_image == true ? 0 : 1}"
  depends_on       = ["data.ibm_is_images.custom_images"]
  href             = "${local.image_url}"
  name             = "${var.vnf_vpc_image_name}"
  operating_system = "centos-7-AMD64"

  timeouts {
    create = "30m"
    delete = "10m"
  }
}

Cela fonctionne très bien pour la première fois avec "terraform apply". Il constate que l'image n'existe pas, donc il crée l'image.

Quand je lance "terraform apply" pour la deuxième fois. Il supprime la ressource "custom_image" créée ci-dessus. Une idée de la raison pour laquelle il supprime la ressource, lorsqu'elle est exécutée pour la deuxième fois?

Aussi, comment créer une ressource basée sur une condition (comme seulement quand elle n'existe pas)?

2
Malar Kandasamy

Dans Terraform, vous devez décider explicitement quel système est responsable de la gestion d'un objet particulier, et inversement quels systèmes consomment simplement un objet existant . Il n'y a aucun moyen de prendre cette décision de manière dynamique, car cela rendrait le résultat non déterministe et - pour les objets gérés par Terraform - ne permettrait pas de savoir quelle configuration terraform destroy détruirait l'objet.

En effet, ce non-déterminisme est la raison pour laquelle vous voyez Terraform dans votre situation flop entre essayer de créer et essayer de supprimer la ressource: vous avez dit à Terraform de ne gérer cet objet que s'il n'existe pas déjà, et donc le la première fois que vous exécutez Terraform après son existence, Terraform verra que l'objet n'est plus géré et prévoit donc de le détruire.


Si votre objectif est de tout gérer avec Terraform, une tâche de conception importante consiste à décider comment les dépendances d'objets circulent dans et entre les configurations Terraform. Dans votre cas, il semble qu'il existe une relation producteur/consommateur entre un système qui gère des images (qui peut ou non être une configuration Terraform) et une ou plusieurs configurations Terraform qui consomment des images existantes.

Si les images sont gérées par Terraform, cela suggère soit que votre configuration principale de Terraform devrait supposer que l'image n'existe pas et la créer inconditionnellement - si votre décision est que l'image appartient au même système que ce qui la consomme - ou il devrait supposer que l'image existe déjà et récupérer les informations à son sujet en utilisant un bloc data.

Une solution possible ici consiste à écrire une configuration Terraform distincte qui gère l'image, puis à n'appliquer cette configuration que dans les situations où cet objet n'est pas censé exister déjà. Ensuite, votre configuration qui consomme l'image existante peut simplement supposer qu'elle existe sans se soucier de savoir si elle a été créée par l'autre configuration Terraform ou non.

Il y a un aperçu plus long de cette situation dans la section de documentation Terraform Module Composition , et en particulier la sous-section Création conditionnelle d'objets . Ce guide se concentre sur les interactions entre les modules dans une seule configuration, mais les mêmes principes sous-jacents s'appliquent aux dépendances entre configurations (via des sources de données) également.

9
Martin Atkins