我想有条件地覆盖一个在计划时具有默认值的模块变量。即,当条件为真时提供覆盖,当条件为假时不提供覆盖,并使用默认值。例子:
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.species
。local.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
如果有帮助请告诉我