Невозможно l oop над списком, используя for_each - PullRequest
0 голосов
/ 17 марта 2020

Я хочу зарезервировать IP, а затем использовать его. Если я создаю отдельный блок google_compute_address для каждого IP, он работает хорошо. Но так как я хочу сделать код как dry и оптимизировать его насколько возможно, я учусь, как l oop и использовать for_each

My main.tf выглядит так

module "nat" {
  source  = "../../modules/nat"

  reserved_ips = [
    {
      name = "gke-frontend-prod-lb"
      ip = "10.238.232.10"
    },
    {
      name = "gke-frontend-test-lb"
      ip = "10.238.232.11"
    }
  ]
} 

Как видите, я хотел бы сформировать список зарезервированных IP-адресов, имеющих имя и IP-адрес.

Теперь давайте посмотрим на мой модуль

Мой variables.tf выглядит как

variable "reserved_ips" {
  type        = list(object({
    name = string
    ip = string
  }))
  description = <<EOF
Reserved IPs.
EOF
}

А main.tf моего модуля выглядит как

locals {
  ips = {
    # for_each needs transform to map
    for ip in var.reserved_ips : "${ip.name}" => "${ip.ip}"
  }
}


resource "google_compute_address" "gke-frontend" {
  for_each = local.ips

  name         = "${each.value.name}"
  subnetwork   = "mysubnet"
  address_type = "INTERNAL"
  address      = "${each.value.ip}"
}

Но запуск кода дает мне

Error: Unsupported attribute

  on ../../modules/nat/main.tf line 11, in resource "google_compute_address" "gke-frontend":
  11:   name         = "${each.value.name}"
    |----------------
    | each.value is "10.238.232.10"

This value does not have any attributes.


Error: Unsupported attribute

  on ../../modules/nat/main.tf line 11, in resource "google_compute_address" "gke-frontend":
  11:   name         = "${each.value.name}"
    |----------------
    | each.value is "10.238.232.11"

This value does not have any attributes.


Error: Unsupported attribute

  on ../../modules/nat/main.tf line 14, in resource "google_compute_address" "gke-frontend":
  14:   address      = "${each.value.ip}"
    |----------------
    | each.value is "10.238.232.10"

This value does not have any attributes.


Error: Unsupported attribute

  on ../../modules/nat/main.tf line 14, in resource "google_compute_address" "gke-frontend":
  14:   address      = "${each.value.ip}"
    |----------------
    | each.value is "10.238.232.11"

This value does not have any attributes.

Я смущен тем, что мне здесь совершенно не хватает.

1 Ответ

2 голосов
/ 17 марта 2020

Проблема в том, что ваш ips local преобразует список в map(string) (т. Е. Карту со строковыми значениями)

locals {
  ips = {
    # for_each needs transform to map
    for ip in var.reserved_ips : "${ip.name}" => "${ip.ip}"
  }
}

Обратите внимание, что справа от => у вас есть "${ip.ip}".

Когда for_each зацикливается на map, он присваивает each.key каждой клавише (a string) и each.value каждому соответствующему значению на карте (в данном случае *) 1015 * также string).

Итак, я думаю, что вы хотите в этом случае что-то вроде следующего

  # ...
  name         = each.key
  # ...
  address      = each.value
  # ...
...