如果条件满足,在Terraform中将额外的元素添加到列表中

24

我在 Terraform 中有一个列表,类似于这样:

array = ["a","b","c"]

在这个 Terraform 文件中,有两个名为 age 和 gender 的变量,如果 age 等于 12 并且 gender 等于 male(即如果 var.age == 12 && var.gender == 'male'),我想让名为 array 的列表多一个元素 "d"(即 array 应该是 ["a", "b", "c", "d"],否则 array 应该是 ["a", "b", "c"])。以下方法正确吗?还是我需要使用另一种方法?

array = ["a","b","c", var.age == 12 && var.gender == 'male' ? "d" : null]
3个回答

36

使用flatten函数还有另一种实现方式:

variable = flatten(["a", "b", "c", var.age == 12 ? ["d"] : []])

让我的一天 -- 对于对象列表也适用! - Brent Bradburn
concat可能更合适,因为它不会展开嵌套列表。 - undefined

10

你有几种方法可以做到这一点。其中一种方法是(示例):

variable "array" {
  default = ["a","b","c"]
}

variable "age" {
  default = 12
}

variable "gender" {
  default = "male"
}

locals {
  array = var.age == 12 && var.gender == "male" ? concat(var.array, ["d"]) : var.array
}

output "test" {
  value = local.array
}

2
好奇...还有哪些其他的方式呢? :) - ravenwing
当我尝试这个时,我得到了一个错误信息:"真和假的结果表达式必须具有一致的类型。'真'元组的长度为6,但'假'元组的长度为5。" - undefined

7
在你的特定示例中解决问题的另一种方法是删除数组末尾的空元素。 compact 可能是最直接的方法,但需要您依赖使用 "" 作为空值的标记。
从文档中可以看到:(来源)

compact 接受一个字符串列表,并返回一个新列表,其中删除了任何空字符串元素。

> compact(["a", "", "b", "c"])
[
  "a",
  "b",
  "c",
]

我更喜欢这个答案,因为它更符合习惯用语。不过我猜它只适用于字符串。

array = compact(["a","b","c", var.age == 12 && var.gender == 'male' ? "d" : ""])`
["a","b","c"] if age != 12 and gender != male
["a","b","c", "d"] if age == 12 and gender == male

当然,""元素可以在列表中任何位置,而compact将处理这个optionality问题。
我还想知道哪个的O()性能最好。我不知道compact在内部是如何实现的,但通常你要么将元素复制到新数组中,要么将元素移动到已删除元素留下的空隙中。
我不希望其他解决方案比这个好多少。也许是concat 因此,它可能需要O(n)次比较+附加,然后需要O(n)空间,因为创建了新列表。

你可以使用null作为哨兵,而不是使用"" - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接