【问题标题】:Terraform tuple to map with removing empty objects?使用删除空对象进行映射的 Terraform 元组?
【发布时间】:2020-12-22 23:57:41
【问题描述】:

我正在尝试在其他资源中为 for_each 循环创建局部变量,但无法按预期制作本地地图。

以下是我尝试过的。 (地形 0.12)

预期的地图循环

temple_list = { "test2-role" = "test-test2-role", ... }

ma​​in.tf

locals {
  tmpl_list = flatten([ 
    for role in keys(var.roles) : {
      for tmpl_vars in values(var.roles[role].tmpl_vars) : 
        role => "test-${role}" if tmpl_vars == "SECRET"
    }
  ])
}

output "tmpl_list" {
  value = local.tmpl_list
}

variable "roles" {
    type = map(object({
        tmpl_vars = map(string)
        tags = map(string)
    }))
    
    default = {
        "test-role" = {
            tmpl_vars = {test = "y"}
            tags = { test = "xxx"}
        }
            "test2-role" = {
            tmpl_vars = { token = "SECRET" }
            tags = {}
        }
        "test3-role" = {
            tmpl_vars = {test = "x"}
            tags = {}
        }
    }
}

错误 来自合并

    | var.roles is map of object with 3 elements

Call to function "merge" failed: arguments must be maps or objects, got
"tuple".

不合并

locals {
  tmpl_list = flatten([ 
    for role in keys(var.roles) : {
      for tmpl_vars in values(var.roles[role].tmpl_vars) : 
        role => "test-${role}" if tmpl_vars == "SECRET"
    }
  ])
}

output "tmpl_list" {
  value = local.tmpl_list
}

variable "roles" {
    type = map(object({
        tmpl_vars = map(string)
        tags = map(string)
    }))
    
    default = {
        "test-role" = {
            tmpl_vars = {test = "y"}
            tags = { test = "xxx"}
        }
            "test2-role" = {
            tmpl_vars = { token = "SECRET" }
            tags = {}
        }
        "test3-role" = {
            tmpl_vars = {test = "x"}
            tags = {}
        }
    }
}

没有合并的结果

tmpl_list = [
  {},
  {
    "test2-role" = "test-test2-role"
  },
  {},
]

我尝试了其他函数,例如 tomap(),但它似乎不适合我。 (我也不确定为什么会创建空的。)

如何将此元组转换为没有空元组的地图?

【问题讨论】:

    标签: terraform terraform0.12+


    【解决方案1】:

    您可以分两步完成:

    1. 将其转换为过滤后的对象列表:
    locals {  
      result = flatten([
        for role, role_value in var.roles: [
          for tmpl_vars in role_value.tmpl_vars: {
            key = role
            value = "test-${role}"
          } if tmpl_vars == "SECRET"
        ]
      ])
    }
    

    local.result 将具有以下值:

    [
      {
        "key" = "test2-role"
        "value" = "test-test2-role"
      },
    ]
    
    1. 然后很容易用for转换成地图:
    my_map = { for item in local.result: item.key => item.value }
    

    给出:

    {
      "test2-role" = "test-test2-role"
    }
    

    【讨论】:

      猜你喜欢
      • 2019-09-15
      • 2015-09-01
      • 2014-03-17
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多