Terraform有条件地覆盖模块变量



我想有条件地覆盖一个在计划时具有默认值的模块变量。即,当条件为真时提供覆盖,当条件为假时不提供覆盖,并使用默认值。例子:

main.tf:

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

my-animmal-module/main.tf:

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

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

我将按照如下所示重新组织您的模块。基本上你会使用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
}

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

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

如果有帮助请告诉我

相关内容

  • 没有找到相关文章

最新更新