Ссылка на блок, который был построен с использованием цикла - PullRequest
0 голосов
/ 17 марта 2020

Мой начальный рабочий код выглядит следующим образом

Сначала я зарезервировал IP-адреса

resource "google_compute_address" "ecmp-1" {
  name         = "nat-ecmp-1"
  address      = "10.8.2.6"
}

resource "google_compute_address" "ecmp-2" {
  name         = "nat-ecmp-2"
  address      = "10.8.2.7"
}

Затем я создал шаблоны экземпляров и прикрепил к ним IP-адреса

resource "google_compute_instance_template" "template-1" {
  name        = "ecmp-1"
  # OMITED EXTRA 
  network_interface {
    # OMITED EXTRA
    network_ip = google_compute_address.ecmp-1.address
  }
}

resource "google_compute_instance_template" "template-2" {
  name        = "ecmp-2"
  # OMITED EXTRA 
  network_interface {
    # OMITED EXTRA
    network_ip = google_compute_address.ecmp-2.address
  }
}

И затем я создаю группы экземпляров из этих шаблонов

resource "google_compute_region_instance_group_manager" "nstance-1" {
  name = "instance-1"

  version {
    instance_template = google_compute_instance_template.template-1.self_link
  }
  target_size  = 1
}

resource "google_compute_region_instance_group_manager" "instance-2" {
  name = "instance-2"

  version {
    instance_template = google_compute_instance_template.template-2.self_link
  }
  target_size  = 1
}

Приведенный выше код работает хорошо, но если бы у меня было ОКОЛО много групп экземпляров для создания, код был бы раздутым. Для этого я сейчас использую карты и for_each

Мой новый код для IP-адресов и для шаблона группы экземпляров выглядит как

resource "google_compute_address" "reservered-ips" {
  for_each = var.nat_ecmp_frontend_reserved_ips

  name         = each.key
  subnetwork   = "egress-ingress"
  address_type = "INTERNAL"
  address      = each.value
}

resource "google_compute_instance_template" "template-1" {
  for_each = var.nat_ecmp_frontend_reserved_ips

  name        = each.key
  # OMITED EXTRA 
  network_interface {
    # OMITED EXTRA
    network_ip = google_compute_address.reservered-ips[each.key].address
  }
}

Теперь следующим шагом является создание группы экземпляров из из вышеупомянутых 2 шаблонов, созданных с использованием for_each l oop.

Итак, когда объявляется это

resource "google_compute_region_instance_group_manager" "instances" {
  for_each = var.nat_ecmp_frontend_reserved_ips

  name = each.key

  version {
    instance_template = google_compute_instance_template.<? ? ? ? ?>
  }
  target_size  = 1
}

Как я могу l oop и ссылку instance_template? Есть ли какой-нибудь динамический способ сделать это?

1 Ответ

1 голос
/ 26 марта 2020
Блок

A resource с установленным for_each отображается в качестве значения карты при обращении к нему, поэтому результатом google_compute_instance_template.template-1 будет карта, ключи которой соответствуют ключам из var.nat_ecmp_frontend_reserved_ips.

. намерение, которое вы хотите описать здесь, это «создать одного менеджера группы экземпляров для каждого шаблона экземпляра», который мы можем представить кратко, используя карту google_compute_instance_template.template-1 в качестве for_each второго ресурса, например:

resource "google_compute_region_instance_group_manager" "instances" {
  for_each = google_compute_instance_template.template-1

  name         = each.key
  target_size  = 1

  version {
    instance_template = each.value.id
  }
}

Устанавливая for_each в google_compute_instance_template.template-1 вместо var.nat_ecmp_frontend_reserved_ips, мы express прямо выражаем намерение, чтобы в каждом шаблоне был один менеджер группы. Но это также имеет более практическое преимущество: each.value внутри этого блока относится к каждому из google_compute_instance_template объектов, и поэтому мы можем использовать each.value.id для получения идентификатора объекта, связанного с each.key.

.
...