Terraform 创建资源,遍历地图的值,而不是关键地形

Terraform 创建资源,遍历地图的值,而不是关键地形,terraform,Terraform,我想不出如何循环遍历下面映射的值之和 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-factor

我想不出如何循环遍历下面映射的值之和

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\u count
属性之和,并基于
instance\u count
创建实例

我可以使用以下内置函数计算实例计数的总和

locals {
  list_sum = length(flatten([for i in var.images: range(i["instance_count"])]))
}
如何遍历
list\u sum
变量并基于
instance\u 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
  }
}
到现在为止,您可能已经知道我的迭代是不正确的。我的资源块必须根据实例计数变量创建资源数量,即
rhel-8-factory-os-ready
的2个实例、
rhel-7-factory-os-ready
的3个实例和
rhel-6-factory-os-ready
的3个实例

因为循环不正确,我无法得到它。如果有人能帮助我正确地迭代以按预期创建资源,那就太好了

多谢各位, 哈沙

这将产生:

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
  }
}
resource“openstack\u compute\u instance\u v2”“instance”{
count=local.list\u sum

image_name=element(local.expanded_image_names,count.index+1)#也许尚未发布的每个资源的地形特征可以是一个()要使用?terraform 0.12已经发布,我正在使用它,因为每个可用的
。我知道我的数据集很复杂,但完全有效。我使用了
setproduct
为每个使用
,但它正在生成
3*3=9
资源,其中我只需要创建8个。我尝试使用
动态
,根本不起作用请仔细阅读。它说“很遗憾,我们无法在Terraform 0.12初始版本中完全完成此功能,但我们计划在后续版本中包含此功能”非常感谢,这将按预期创建资源。但是,由于它使用了
计数
,因此存在一个缺点。但是,这是我的选择。这只会影响我增加/减少讨论的计数。除非我使用正确的键,否则地形无法保证按预期方式进行更改。不过,非常感谢您的回答。@h阿尔沙文,你试过每个人而不是计数吗?
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
  }
}