【问题标题】:Terraform: Set optional resource attribute if condition is met, otherwise don't declare itTerraform:如果满足条件,则设置可选资源属性,否则不声明
【发布时间】:2020-07-22 12:21:12
【问题描述】:

Terraform 上的一些资源支持可选属性。我有兴趣仅在满足条件时声明和设置可选属性的值。否则,根本不要声明它。

我发现的所有建议都是基于声明属性并将其值设置为null(如果条件不满足),而不是根本不声明属性。

有没有办法让我做类似以下的事情?在伪代码中:

resource "some_resource" "this" {
  name = var.name

  if var.name == "some_name":
    some_optional_attribute = "some_value"
  else:
    pass  # do nothing, don't even declare the optional attribute
}

让我知道,提前谢谢!

【问题讨论】:

    标签: conditional-statements terraform hcl terraform0.12+


    【解决方案1】:

    我认为没有比简单地执行以下操作更好的方法了:

    resource "some_resource" "this" {
      some_optional_attribute = var.name == "some_name" ? var.name : null
    }
    

    当您将属性声明为 null 时,基本上意味着它没有被使用。以上在我看来相当于你的if语句。

    【讨论】:

    • 之前创建的一些资源没有声明该可选属性。如果我们简单地声明可选属性并将其设置为null,则提供者需要销毁/创建操作。使用您的三元示例,terraform plan 表示Plan: 10 to add, 0 to change, 10 to destroy。不幸的是,破坏这些资源不是我们的选择。
    • 如果 Terraform 可以“假设”声明并设置为 null 的可选属性等价于最初未声明的可选属性,那就太好了,与远程状态。
    • 是的,肯定没有别的办法,除非你直接修改状态文件,给资源加上附加属性,在那里设置为null。不是最好的方法,但它对我有用。请注意,我个人反对直接修改状态。
    • 在 Terraform 内部,显式设置为 null 的参数与未设置的参数之间没有区别:提供者逻辑无法看到差异以根据它进行区分。我希望看到 Terraform 计划对此进行更改的唯一情况是,如果条件表达式产生一个在应用之前无法知道的值,因此 Terraform 必须保守地假设该值会改变,但这似乎不太可能假设的var.name。如果您问一个 问题,即为什么 Terraform 会检测到您的案例发生变化,我也许可以解释一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多