【问题标题】:In Terraform 0.12, how to skip creation of resource, if resource name already exists?在 Terraform 0.12 中,如果资源名称已经存在,如何跳过资源的创建?
【发布时间】: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


【解决方案1】:

在 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 中有对此情况的详细概述。该指南侧重于单个配置中模块之间的交互,但同样的基本原则也适用于配置之间配置(通过数据源)的依赖关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 2021-01-03
    • 1970-01-01
    • 2021-04-05
    • 2020-04-13
    • 2020-11-07
    • 2022-01-24
    相关资源
    最近更新 更多