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
值