下面的示例演示了如何使用条件运算符来可选地指定资源是否被创建,并展示了处理当资源未被创建时返回输出的方法。这是通过使用一个模块完成的,并使用对象变量的元素作为标志来指示是否应该创建资源。
但是,为了具体回答您的问题,您可以按如下方式使用条件运算符:
output "module_id" {
value = var.module_config.skip == true ? null : format("%v",null_resource.null.*.id)
}
然后在调用 main.tf 中访问输出:
module "use_conditionals" {
source = "../../scratch/conditionals-modules/m2"
a = module.skipped_module.module_id
b = module.notskipped_module.module_id
c = module.default_module.module_id
}
以下是完整示例。注意:此示例使用 terraform v0.14.2。
provider "null" {}
module "skipped_module" {
source = "../../scratch/conditionals-modules/m1"
module_config = {
skip = true
name = "skipped"
}
}
module "notskipped_module" {
source = "../../scratch/conditionals-modules/m1"
module_config = {
skip = false
name = "notskipped"
}
}
module "default_module" {
source = "../../scratch/conditionals-modules/m1"
}
module "use_conditionals" {
source = "../../scratch/conditionals-modules/m2"
a = module.skipped_module.module_id
b = module.notskipped_module.module_id
c = module.default_module.module_id
}
output skipped_module_name_and_id {
value = module.skipped_module.module_name_and_id
}
output notskipped_module_name_and_id {
value = module.notskipped_module.module_name_and_id
}
output default_module_name_and_id {
value = module.default_module.module_name_and_id
}
模块
resource "null_resource" "null" {
count = var.module_config.skip ? 0 : 1
provisioner "local-exec" {
command = <<EOT
#!/usr/bin/env bash
echo "null resource, var.module_config.name: ${var.module_config.name}"
EOT
}
}
variable "module_config" {
type = object ({
skip = bool,
name = string
})
default = {
skip = false
name = "<NAME>"
}
}
output "module_name_and_id" {
value = var.module_config.skip == true ? "SKIPPED" : format(
"%s id:%v",
var.module_config.name,
null_resource.null.*.id
)
}
output "module_id" {
value = var.module_config.skip == true ? null : format("%v",null_resource.null.*.id)
}
null
。间接的答案是,看起来代码条件和组织应该重新设计以避免这个问题,因为那个subnet_id
的三元运算符似乎应该不同。 - Matt Schuchard