terraform .11到.12更改导致空列表很重要

时间:2019-12-02 08:37:46

标签: terraform

在0.11中,我们有一个创建Go​​ogle主机的模块。该模块将创建 根据传入的参数以两种方式之一使用它, 两种不同的资源声明,即

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循环。

1 个答案:

答案 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