我有两个不同的列表list_a
和list_b
,我想根据值local.server
进行选择
我已经尝试过了,但是没用
locals {
server = "ubuntu"
list_a = "${list("aaa")}"
list_b = "${list("bbb")}"
chosen = "${local.server == "ubuntu" ? local.list_a : local.list_b}"
}
output "chosen" {
value = "${local.chosen}"
}
Error: Error asking for user input: 1 error(s) occurred:
* local.chosen: local.chosen: At column 3, line 1: conditional operator cannot be used with list values in:
${local.server == "ubuntu" ? local.list_a : local.list_b}
答案 0 :(得分:2)
插值似乎仅适用于字符串,因此,如果我们使三元表达式通过连接经常未使用的字符(即|
delim = "|"
chosen = "${local.server == "ubuntu" ?
join(local.delim, local.list_a) :
join(local.delim, local.list_b)}"
然后我们可以将输出更改为在同一定界符上分割
output "chosen" {
value = "${split(local.delim, local.chosen)}"
}
✗ terraform apply
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
chosen = [
aaa
]
答案 1 :(得分:2)
在Terraform v0.11中,条件运算符仅适用于基本类型的值(字符串,数字,布尔值)。您可以通过以下方法解决此问题:构造带有两个选项的地图,然后有条件地选择一个键,而不是有条件地选择一个值:
locals {
lists = {
a = "${list("aaa")}"
b = "${list("bbb")}"
}
}
output "chosen" {
value = "${local.lists[local.server == "ubuntu" ? "a" : "b"]}"
}
在即将发布的(撰写本文时)Terraform v0.12中,条件运算符可以使用任何类型的值,只要在类型检查期间可以将true和false表达式都转换为相同类型,因此您原来的示例可以使用,但可以使用v0.12也引入的一流表达式语法进行重写:
locals {
server = "ubuntu"
list_a = ["aaa"]
list_b = ["bbb"]
chosen = local.server == "ubuntu" ? local.list_a : local.list_b
}
output "chosen" {
value = local.chosen
}
答案 2 :(得分:1)
对于仍然使用terraform <0.12.x的用户来说,有一个不错的解决方法:
您可以使用split函数从列表中创建字符串,评估teranry,然后使用split函数将其重新创建为列表。
a = ["list", "values", "for ubuntu"]
b = ["list", "values", "for others"]
new_list = "${split(",", local.server == "ubuntu" ? join(",", local.a) : join(",", local.b))}"