Terraform: реорганизация моих списков в выходном файле - PullRequest
1 голос
/ 09 октября 2019

Я пишу код Terraform, чтобы зарезервировать несколько IP-адресов в каждом регионе, с которым мы работаем в Google, и который позже я буду использовать для назначения нескольким конкретным экземплярам.

Так что в моем модуле яиметь

resource "google_compute_address" "reserved_public_ip" {
} 

, который перебирает счетчик и записывает проект, адрес_типа, имя, регион, подсеть и адрес.

Так что в итоге я получаю массив google_compute_address.reserved_public_ip. Я могу легко составить список всех имен и адресов ip с помощью

output "public_reservedip" {
  value = "${zipmap(
    google_compute_address.reserved_public_ip.*.name,
    google_compute_address.reserved_public_ip.*.address
  )}"
}

Но я не могу составить карту региона-> ipaddress с помощью zipmap, используя * .region, потому что на регион приходится 3 ips,так что я бы в конечном итоге только с последним IP-адресом, так как ключ региона повторяется.

Я пытаюсь построить вывод в виде

value = {
   region1 = [list of ips]
   region2 = [list of ips]
   etc...
}

Так что я могу кормить этов мой модуль, который создает соответствующие хосты gcp, и он может получить список для региона, который он создает в настоящее время, но я не могу понять преобразование, которое позволит мне сделать это.

Пример данных, которые я долженработа с:

module.gcp-network.google_compute_address.reserved_public_ip.0:
  id = myproject/northamerica-northeast1/dns-reserve-1-test
  address = 10.128.0.2
  address_type = INTERNAL
  creation_timestamp = 2019-10-08T15:41:08.690-07:00
  description =
  name = dns-reserve-1-test
  network_tier = PREMIUM
  project = myproject
  purpose = GCE_ENDPOINT
  region = northamerica-northeast1
  self_link = https://www.googleapis.com/compute/v1/projects/myproject/regions/northamerica-northeast1/addresses/dns-reserve-1-test
  subnetwork = https://www.googleapis.com/compute/v1/projects/myproject/regions/northamerica-northeast1/subnetworks/test-northamerica-northeast1-public-subnet
  users.# = 0

1 Ответ

1 голос
/ 10 октября 2019

Вы использовали name в более ранних примерах, но затем упомянули регионы в последнем примере, поэтому я не уверен, что полностью понял, чего вы пытались достичь здесь, но я собираюсь привести пример с использованием region атрибут, который можно адаптировать к name вместо этого, если это то, что вам нужно:

  value = {
    for addr in google_compute_address.reserved_public_ip : addr.region => addr.address...
  }

Это for выражение , проецирующее ваш список объектов на карту из региона вадреса. Символ ... после выражения addr.address указывает, что вы хотите сгруппировать по addr.region, поэтому результатом здесь будет карта из строк в списки строк, как вы хотели.

Это функция Terraform 0.12. В Terraform 0.11 нет аналога.

...