Terraform 从地图列表创建重新构造的地图

Terraform 从地图列表创建重新构造的地图,terraform,Terraform,我带着一个问题来了,这几天我都解决不了。我有一个定义数据磁盘的数据结构,由每个磁盘的映射列表组成: variable "data_disks_node" { description = "Data disk configuration lun, size in gib, mountpoint" default = [ { lun = 0 size = 200 mount = "/opt/moun

我带着一个问题来了,这几天我都解决不了。我有一个定义数据磁盘的数据结构,由每个磁盘的映射列表组成:

variable "data_disks_node" {
  description = "Data disk configuration lun, size in gib, mountpoint"
  default = [
    {
      lun = 0
      size = 200
      mount = "/opt/mount1"
    },
    {
      lun = 1
      size = 32
      mount = "/opt/mount2"
    },
  ]
}
我使用这个结构来创建数据磁盘,使用动态块和for_(这非常有效),但是需要创建一个标签映射,其中的值来自同一个数据结构

我需要用已配置的数据磁盘和装载点标记已创建的资源(不要问,不能更改该要求),并需要以下映射结果:

data_disk_tags = {
  lun0 = "/opt/mount1"
  lun1 = "/opt/mount2"
}
因此,我不仅需要从映射列表中创建映射,还需要过滤结果,将一个值映射为键,将另一个值映射为值,还需要在新键前面加上字符串“lun”。我对此束手无策,因为我只是在Terraform上到处工作,找不到解决这个问题的任何记录案例。如果有必要,使用的地形为0.12.20。到目前为止,我最接近(甚至不接近)的是:

locals {
  vm_joined_tags = merge(var.vm_tags, zipmap(flatten([for item in var.vm_data_disk_configuration : keys(item)]), flatten([for item in var.vm_data_disk_configuration : values(item)])))
}
它可以工作,但只创建第一个源映射和键值的映射,如

{
  lun = 1
  size = 200
  mount = "/opt/mount1"
}

第二张地图根本不存在。我非常感谢任何可能的解决方案的帮助或指点。更改数据结构是可能的,但应尽可能避免,因为其他模块代码依赖于此。Ff需要任何进一步的输入,请告诉我,我会提供。

您似乎在正确的道路上尝试循环列表,但有一种更简单的方法:

variable "data_disks_node" {
  description = "Data disk configuration lun, size in gib, mountpoint"
  default = [
    {
      lun   = 0
      size  = 200
      mount = "/opt/mount1"
    },
    {
      lun   = 1
      size  = 32
      mount = "/opt/mount2"
    },
  ]
}

locals {
  vm_joined_tags = { for disk in var.data_disks_node : format("lun%s", disk.lun) => disk.mount }
}

output "vm_joined_tags" {
  value = local.vm_joined_tags
}
应用此选项可输出所需的结构:

Outputs:

vm_joined_tags = {
  "lun0" = "/opt/mount1"
  "lun1" = "/opt/mount2"
}
将大括号括起来意味着它创建了一个映射(它的语法与):

for表达式周围括号的类型决定了表达式的类型 它产生的结果。上面的示例使用了
[
]
,这将生成 元组。如果改为使用
{
}
,结果是一个对象,两个 结果表达式必须以
=>
符号分隔:

{for s in var.list : s => upper(s)}
因此,上面的示例在
var.data\u disks\u节点
中的磁盘上循环,并使用每个磁盘的
lun
键创建一个映射,前缀为字符串
“lun”
和每个磁盘的
mount