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

Mal*_*amy 25 resources exists terraform

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

我为此做了以下工作:

阅读自定义图像列表,

data "ibm_is_images" "custom_images" {
}
Run Code Online (Sandbox Code Playgroud)

检查图像是否已经存在,

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}"
}
Run Code Online (Sandbox Code Playgroud)

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

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"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mar*_*ins 34

在 Terraform 中,您需要明确决定哪个系统负责管理特定对象,相反,哪些系统只使用现有对象。没有办法动态地做出决定,因为这会使结果不确定,而且——对于由 Terraform 管理的对象——不清楚哪个配置terraform destroy会破坏对象。

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


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

如果图像是由Terraform管理那么这表明,要么你的主Terraform配置应该承担的图像也不会存在,并且无条件地创建它-如果你的决定是该图像是由同一系统什么消耗它拥有-或者应该假设图像确实已经存在,检索使用一个关于它的信息data块。

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

在 Terraform 文档部分Module Composition 中对这种情况有更详细的概述,特别是子部分Conditional Creation of Objects。该指南侧重于单个配置中模块之间的交互,但相同的基本原则也适用于配置之间的依赖关系(通过数据源)。