在 Terraform 0.12 中,如果资源名称已存在,如何跳过资源的创建?

2024-01-06

我正在使用 Terraform 版本 0.12。如果同名资源已存在,我需要跳过资源创建。

我为此做了以下操作:

读取自定义图像列表,

data "ibm_is_images" "custom_images" {
}

检查图像是否已经存在,

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}"
}

仅当图像存在时创建为 false。

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"
  }
}

第一次使用“terraform apply”时效果很好。它发现该图像不存在,因此它创建图像。

当我第二次运行“terraform apply”时。它正在删除上面创建的资源“custom_image”。知道为什么它在第二次运行时删除资源吗?

另外,如何根据某些条件创建资源(例如仅当资源不存在时)?


在 Terraform 中,您需要明确决定哪个系统负责管理特定对象,反之亦然哪些系统只是消耗一个现有的对象。无法动态地做出该决定,因为这会使结果不确定,并且对于 Terraform 管理的对象来说,不清楚哪个配置是terraform destroy会破坏该物体。

事实上,这种非确定性就是为什么您会看到 Terraform 在您的情况下在尝试创建资源和尝试删除资源之间失败:您已经告诉 Terraform 仅在该对象尚不存在时才管理该对象,因此当 Terraform 存在后第一次运行 Terraform 时,Terraform 会发现该对象不再被管理,因此它将计划销毁它。


如果您的目标是使用 Terraform 管理一切,则一项重要的设计任务是确定对象依赖关系如何在 Terraform 配置内部和之间流动。在您的情况下,管理图像的系统(可能是也可能不是 Terraform 配置)与使用现有图像的一个或多个 Terraform 配置之间似乎存在生产者/消费者关系。

如果图像由 Terraform 管理,那么这表明您的主 Terraform 配置应该假设图像确实not存在并无条件创建它 - 如果您的决定是图像由与使用它的系统相同的系统拥有 - 或者它应该假设图像does已经存在并使用检索有关它的信息data block.

这里的一个可能的解决方案是编写一个单独的 Terraform 配置来管理图像,然后仅在该对象不存在的情况下应用该配置。然后,使用现有图像的配置可以假设它存在,而不关心它是否是由其他 Terraform 配置创建的。

Terraform 文档部分对这种情况有更详细的概述模块组成 https://www.terraform.io/docs/modules/composition.html,特别是小节有条件地创建对象 https://www.terraform.io/docs/modules/composition.html#conditional-creation-of-objects。该指南重点关注单个配置中模块之间的交互,但相同的基本原则也适用于依赖关系between配置(通过数据源)也是如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Terraform 0.12 中,如果资源名称已存在,如何跳过资源的创建? 的相关文章

随机推荐