【问题标题】:Terraform conditionally override module variableTerraform 有条件地覆盖模块变量
【发布时间】:2021-11-20 02:13:03
【问题描述】:

我想覆盖具有默认值的模块变量,仅在计划时有条件地进行。 IE。当条件为真时提供覆盖,当条件为假时不提供覆盖并使用默认值。示例:

ma​​in.tf:

terraform {
  required_version = ">= 0.14.9"
}

variable "random" {
}

module "my_animal_module" {
  source = "./my-animal-module"
  species = var.random > 7 ? "monkey" : "horse"
}

我的动物模块/main.tf:

variable species {
  default = "horse"
}

resource "local_file" "animal" {
  content = "${var.species}"
  filename = "./animal.txt"
}

如上所述,我可以只提供默认值 (species = var.random > 7 ? "monkey" : "horse"),但这需要调用者知道模块的默认值,这会破坏封装。另一种方法是使用一些占位符作为默认值,例如“”,然后在模块中测试该条件并使用建议的 in this SO answer 不同的值。这稍微好一点,但仍然是乏味和间接的。这个 SO 答案已经超过 3 年了,从那时起,terraform 发生了很大变化。所以我想知道,有没有一种干净的方法来解决这个问题?本质上需要的是类似于dynamic blocks 的动态变量,但AFAIK 尚不存在。

【问题讨论】:

  • 我已经找到答案了。
  • 确实,您在问题中的链接答案是 Terraform
  • @Marcin 你的解决方案是对先前已知习语的改进,但仍然不是 100% 清楚没有更清洁的解决方案。断言没有比当地人更好的方法是我在回答中所追求的。
  • 我不知道更好的方法。但也许@MartinAtkins 会知道一个。
  • spinkus:您可能希望看到 cmets 就类似的问题:stackoverflow.com/questions/69165146/…。知识渊博的 ydaetskcoR 在 cmets 中解释了您在此处要执行的操作的限制。有趣的是,在阅读我的评论后,该问题的提问者显然得出了与@Marcin 在下面提供的几乎相同的答案。总之,如果你想要更好的东西,我认为你必须等到如果/当 HCL3 存在和/或自定义 TF 函数。

标签: terraform


【解决方案1】:

我将重组您的模块,如下所示。基本上你会使用local.species 值而不是直接使用var.specieslocal.species 将根据父级的值进行设置。

variable species {
  default = null
}

locals {
  defaults = {
    species = "horse"
  }
  species = coalesce(var.species, local.defaults["species"])
}

resource "local_file" "animal" {
  content = "${local.species}"
  filename = "/tmp/animal.txt"
}

然后在父级中:

module "my_animal_module" {
  source = "./my-animal-module"
  species = var.random > 7 ? "monkey" : null
}

【讨论】:

  • 这实际上是先前已知解决方案的变体,除了您使用中间本地而不是中间变量。但我想 local 确实更有意义,因为它不会被意外覆盖。对我来说仍然很奇怪,没有更直接的方法可以做到这一点。
  • @spinkus 我的原始答案无效,因此必须将其修改为您现在看到的内容。这个有效。
  • 1.如果未指定,我相信变量默认值为null。 2、如果species的值完全基于另一个变量的值,感觉应该是传递那个变量而不是species,然后species值的整个逻辑封装在locals中。然而,这是字面上的正确答案。 3. local.species 三元可能是species = coalesce(var.species, local.defaults["species"]) 使用空合并模式来简化。
  • @MattSchuchard 谢谢。我知道应该有比条件更好的东西。忘了coalesce
  • @MattSchuchard “1。如果未指定,我相信变量默认值为空。”我不认为这是真的。必须指定没有默认值的变量。
【解决方案2】:

您可以使用条件表达式。请参考以下页面: https://www.terraform.io/docs/language/expressions/conditionals.html

或者您可以在变量块中使用验证。参考以下页面: https://www.terraform.io/docs/language/values/variables.html

如果有帮助请告诉我

【讨论】:

    猜你喜欢
    • 2021-05-04
    • 1970-01-01
    • 2021-09-15
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 2013-01-22
    • 1970-01-01
    相关资源
    最近更新 更多