Создавайте ресурсы, перебирая значения карты, а не ключа - терраформа - PullRequest
0 голосов
/ 18 февраля 2020

Я не мог понять, как я могу l oop через сумму значений на карте ниже.

variable "images" {
  default = {
    "rhel-8-factory-os-ready" = {
       "availability_zone" = "eu-fra-1ah"
       "flavor" = 4
       "instance_count" = 2
       "image_name" = "rhel-8-factory-os-ready"
    },
    "rhel-7-factory-os-ready" = {
       "availability_zone" = "eu-fra-1ai"
       "instance_count" = 3
       "flavor" = 3
       "image_name" = "rhel-7-factory-os-ready"
    },
    "rhel-6-factory-os-ready" = {
       "availability_zone" = "eu-fra-1ah"
       "instance_count" = 3
       "flavor" = 3
       "image_name" = "rhel-6-factory-os-ready"
    }
  }
}

Здесь я должен пройти через сумму instance_count атрибута из всех ключей и создать экземпляры на основе instance_count.

Я мог бы вычислить сумму instance_count, с нижеприведенными встроенными функциями.

locals {
  list_sum = length(flatten([for i in var.images: range(i["instance_count"])]))
}

Как я могу пройти через переменная list_sum и создание ресурсов на основе instance_count?

Я создал списки ниже для создания ресурсов: *

locals {
  list_images = tolist(keys(var.images))
  list_instance_count = [for i in var.images: i["instance_count"]]
  list_flavors = [for i in var.images: i["flavor"]]
  list_image_names = [for i in var.images: i["image_name"]]
  list_availability_zones = [for i in var.images: i["availability_zone"]]
}

Мой ресурс ::

resource "openstack_compute_instance_v2" "instance" {
  count = local.list_sum
  image_name = element(local.list_image_names, count.index +1 )
  flavor_id = element(local.list_flavors, (count.index + 1) )
  name = element(local.list_image_names, (count.index + 1) )
  security_groups = var.security_group
  availability_zone = element(local.list_availability_zones, (count.index + 1) )
  key_pair = "foptst"
  network {
    name = var.network_name
  }
}

К настоящему времени вы, возможно, знаете, что моя итерация неверна. Мой блок ресурсов должен создать количество ресурсов на основе instance_count var ie., 2 экземпляра rhel-8-factory-os-ready, 3 экземпляров rhel-7-factory-os-ready и 3 экземпляров rhel-6-factory-os-ready.

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

Заранее большое спасибо, Харша

1 Ответ

1 голос
/ 18 февраля 2020
locals {
  expanded_image_names = flatten([
    for key, value in var.images : [
      for counter in range(var.images[key]["instance_count"]): var.images[key]["image_name"]
    ]
  ])
}

output "expanded_image_names" {
  value = local.expanded_image_names
}

Это даст:

expanded_image_names = [
  "rhel-6-factory-os-ready",
  "rhel-6-factory-os-ready",
  "rhel-6-factory-os-ready",
  "rhel-7-factory-os-ready",
  "rhel-7-factory-os-ready",
  "rhel-7-factory-os-ready",
  "rhel-8-factory-os-ready",
  "rhel-8-factory-os-ready",
]

Затем используйте их:

resource "openstack_compute_instance_v2" "instance" {
  count = local.list_sum
  image_name = element(local.expanded_image_names, count.index +1 )  # <-----
  ... # Do similar for the others.

  key_pair = "foptst"
  network {
    name = var.network_name
  }
}
...