【发布时间】:2020-04-16 21:13:29
【问题描述】:
我使用的是 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}"
}
仅当图像存在为假时才创建。
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”。知道为什么它会在第二次运行时删除资源吗?
另外,如何根据某些条件(比如不存在时)创建资源?
【问题讨论】:
-
所有用于检查资源是否存在并维护其幂等性的代码都是不必要的,因为提供者 CRUD 函数已经提供了该功能。尝试删除所有相关代码并仅关注实际资源。如果它的行为不正确,则需要朝那个方向进行调试。
-
在这篇博客中,itnext.io/… 他解释了相同的行为:我在混合两种样式时观察到的行为是,如果独立资源不存在,则会创建它们。但是,一旦创建,如果我再次运行 terraform apply,它们将被删除。如果我再试一次,它们就会被创建等等……
-
这听起来像是一个错误,或者您的状态没有被正确保存/读取。您可以删除本地检查并向我们展示创建的应用程序和尝试删除它的应用程序的输出吗?
-
我这里开了一个bug:github.com/hashicorp/terraform/issues/23772
-
你只需要重构你的 tf 模块来避免这个错误的想法
标签: resources terraform exists