Я пытаюсь настроить Google Cloud Load Balancer, и один шаг требует обновления именованных портов в группах управляемых экземпляров, для которых мне нужна отформатированная строка для генерации вызова командной строки.Я чувствую, что это должно быть чем-то, что я могу автоматизировать с помощью terraform, но я борюсь с отображением форматов данных.
У меня есть два набора исходных данных.
Из ресурса группы экземпляров:
data "google_compute_instance_group" "all" {
count = "${length(var.backend)}"
self_link = "${element(var.backend, count.index)}"
}
Я получаю существующие именованные порты от data.google_compute_instance_group.all.*.named_port
в формате:
[
[
map[name:https port:30443],
map[name:http port:30080]
],
[
map[name:https port:30443],
map[port:30080 name:http]
]
]
У меня также есть порты, которые я хочу убедиться, что они определены в моей собственной карте:
variable "node_ports" {
type = "map"
default = {
"https" = "30443"
"monitor" = "30012"
}
}
Между ними могут быть совпадения;Я хочу выбрать значение, определенное в переменной.(Именованные порты одинаковы для всех групп экземпляров.)
Сначала я хочу объединить две карты в одну карту, чтобы убедиться, что для каждого имени существует один порт.Как я могу преобразовать первый список списков карт в одну карту, чтобы получить это?
{
"http" = "30080"
"https" = "30443"
"monitor" = "30012"
}
Во-вторых, я хочу преобразовать все это в формат, необходимый в командной строке:
gcloud --project ${var.project} compute instance-groups set-named-ports ${basename(var.backend[count.index])} --named-ports=https:443,http:30080,monitor:30012
Я думаю, я мог бы сделать это с помощью хака jsonencode
, но я был бы заинтересован в лучших решениях:
"${replace(jsonencode(named_ports), "/[\\{\\}\"\\s]/", "")}"