在Terraform中使用三进制在2个不同的列表之间进行选择

时间:2019-04-09 17:08:19

标签: terraform

我有两个不同的列表list_alist_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}

3 个答案:

答案 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))}"