在0.11中,我们有一个创建Google主机的模块。该模块将创建 根据传入的参数以两种方式之一使用它, 两种不同的资源声明,即
resource "google_compute_instance" "this_public" {
count = var.instance_count * var.flag
}
resource "google_compute_instance" "this_private" {
count = var.instance_count * (1 - var.flag)
}
(经过简化,但等效)
对于输出,我们将收集两种可能的资源,将它们一起猛击,然后取其中任何一个都不空白。 (给定代码,一个或另一个将生成,而不会两者都生成,因此可以保证这些结构之一为空。)
this_instance_id = compact(
concat(
coalescelist(
google_compute_instance.this_public.*.id,
google_compute_instance.this_private.*.id,
),
[""],
),
)
现在这失败了,因为tf 0.12关心这两个中的一个为空, 而且无法收拾它。
在不完全重新设计的情况下,我看不到如何重新进行这项工作 在各个元素上有很多for循环。
答案 0 :(得分:0)
鉴于这两种资源在本质上是互斥的,我认为类似以下的表达式将产生等效的结果:
concat(
google_compute_instance.this_public.*.id,
google_compute_instance.this_private.*.id,
)
由于这两个列表之一肯定是空的,所以它将始终是var.instance_count
个项目的列表,其中包含一个空列表,我认为这是您在此处寻找的结果。
一种不同的处理方式,可能对条件配置的将来的读者更明确,那就是依靠条件运算符,该条件运算符现在对于Terraform 0.12中的所有类型的值都是完全通用的:
var.flag != 0 ?
google_compute_instance.this_public.*.id :
google_compute_instance.this_private.*.id