【问题标题】:Reduce map(map(map(list(string)))) terraform减少地图(地图(地图(列表(字符串))))地形
【发布时间】:2021-06-19 02:07:12
【问题描述】:

您好,有什么巧妙的方法可以使用 terraform 将 map(map(map(list(string)))) 转换为 map(map(list(string)))。

这是我的输入结构的样子:

   exception_expr_rule = {
   "project" = {
     "user" = {
       sqli-stable = [
         "value",
       ],
       xss-stable = [
         "value",
         "value",
         "value"
       ],
       rce-stable = [
         "value"
       ],
       ...... = []
     },
     "user2" = {
       xss-stable = [
         "value",
       ],
       other-subsubkey = [
         "value"
       ],
       other-subsubkey = [
         "value"
       ],
       other-subsubkey = [
         "value"
       ],
      }
      "userN" = {....}
   }}

这就是我想要的样子:

exception_expr_rule = {
 "project.user" = {
    sqli-stable = [
      "value",
    ],
    xss-stable = [
      "value",
      "value",
      "value"
    ],
    rce-stable = [
      "value"
    ]
  },
"project.user2" = {
    xss-stable = [
      "value",
    ],
    other-subsubkey = [
       "value"
     ],
     .....
   }
"project.userN" = {.....}
}

你们能帮我实现这个吗?

我试过了

    exception_expr_rule_list = flatten([
    for projects,value in var.expr_rule_list : [
      for user_name,exceptions in value: {
          key = "${projects}.${user_name}"
          value = exceptions
        }
    ]
  ])

但这不是我想要的。

【问题讨论】:

    标签: terraform terraform0.12+


    【解决方案1】:

    虽然很棘手,但 flattenfor 循环的组合可以帮助您实现目标。

    我已经在控制台中使用 Terraform v0.14.5 对此进行了测试。

    首先我定义了一个复制你的输入结构的变量:

    variable "exception_expr_rule" {
      type = map
    
      default = {
        "project" = {
          "user" = {
            sqli-stable = [
              "value"
            ],
            xss-stable = [
              "value",
              "value",
              "value"
            ],
            rce-stable = [
              "value"
            ]
          }
        }
      }
    }
    

    然后我创建了一个新的 new 局部变量,它结合并展平了它:

    locals {
      new = flatten([
        for key in keys(var.exception_expr_rule): [
          for subkey, subvalue in var.exception_expr_rule[key]: {
            "${key}.${subkey}" = subvalue
          }
        ]
      ])
    }
    

    如果我通过local.new[0] 访问它,我会得到所需的输出:

    > local.new[0]
    {
      "project.user" = {
        "rce-stable" = [
          "value",
        ]
        "sqli-stable" = [
          "value",
        ]
        "xss-stable" = [
          "value",
          "value",
          "value",
        ]
      }
    }
    

    【讨论】:

    • 您好,感谢您的支持,但问题是我的输入结构是可变的,我可以在同一个项目下拥有更多的子键和更多的用户。最后结果是每个用户群,所以我需要通过 subekys 访问,不幸的是无法使用列表
    • 不确定你的意思,如果你扩展你的问题来展示一个例子,这可能是最好的。如果您添加更多“项目”或“用户”,我的解决方案将有效,因为密钥是通过 "${key}.${subkey}" 动态设置的,因此项目“foo”和用户“bar”将产生 foo.bar
    • 更新了我的起始结构。好的,对于动态设置的键,但是在 jour 解决方案中我不能做类似 local.new["foo.bar"]["rce-stable"]
    • 由于外部flatten 地图被包装在一个只有一个元素的列表中,因此您需要使用local.new[0] 访问它,即local.new[0]["foo.bar"]["rce-stable"] 将带您到达那里。
    • 解决了 new = {for pair in flatten([ for key in keys(var.exception_expr_rule_list): [ for subkey, subvalue in var.exception_expr_rule_list[key]: { key = "${key} .${subkey}" value = subvalue } ] ]): "${pair.key}" => pair.value }
    【解决方案2】:

    解决了

        new = {for pair in flatten([ 
           for key in keys(var.exception_expr_rule_list): [ 
              for subkey, subvalue in var.exception_expr_rule_list[key]: { 
                  key = "${key}.${subkey}" 
                  value = subvalue 
              } 
            ] 
           ]): "${pair.key}" => pair.value 
    } 
    

    【讨论】:

      猜你喜欢
      • 2019-11-22
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      相关资源
      最近更新 更多