Использование троичного в terraform для выбора между 2 различными списками - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть два разных списка 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}

Ответы [ 2 ]

3 голосов
/ 11 апреля 2019

В Terraform v0.11 условный оператор работает только со значениями примитивного типа (строки, числа, логические значения).Вы можете обойти это, создав карту с двумя вариантами, а затем условно выбрав ключ, в отличие от условного выбора значения:

locals {
  lists = {
    a = "${list("aaa")}"
    b = "${list("bbb")}"
  }
}

output "chosen" {
  value = "${local.lists[local.server == "ubuntu" ? "a" : "b"]}"
}

В грядущей (на момент написания) версии Terraform v0.В выпуске условный оператор работает со значениями любого типа, при условии, что и выражения 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 голосов
/ 09 апреля 2019

Интерполяция работает только со строками, поэтому, если мы заставим троичное выражение возвращать строку, объединяя часто неиспользуемый символ, т.е. |

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
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...