Terraform 寻找一种更简洁的嵌套循环方法

Terraform 寻找一种更简洁的嵌套循环方法,terraform,hcl,Terraform,Hcl,正在寻找一种更干净/更可读的方式来实现Terraform中的嵌套循环。我将举例说明 假设角色的变量如下所示: variable "roles" { type = "list" default = [ { name = "LOADER" schemas = { RAW = ["USAGE", "ALL"] SRC =

正在寻找一种更干净/更可读的方式来实现Terraform中的嵌套循环。我将举例说明

假设角色的变量如下所示:

variable "roles" {
  type    = "list"
  default = [
    {
      name    = "LOADER"
      schemas = {
        RAW = ["USAGE", "ALL"]
        SRC = ["ALL"]
      }
    },
    {
      name    = "USER"
      schemas = {
        RAW = ["DELETE", "OBJECT"]
        SRC = ["USE"]
      }
    }
  ]
}
在此基础上,我想以一个字典列表结束,该列表如下所示:

output = [
  {
    "privilege" = "USAGE"
    "role" = "LOADER"
    "schema" = "RAW"
  },
  {
    "privilege" = "ALL"
    "role" = "LOADER"
    "schema" = "RAW"
  },
  {
    "privilege" = "ALL"
    "role" = "LOADER"
    "schema" = "SRC"
  },
  {
    "privilege" = "DELETE"
    "role" = "USER"
    "schema" = "RAW"
  },
  {
    "privilege" = "OBJECT"
    "role" = "USER"
    "schema" = "RAW"
  },
  {
    "privilege" = "USE"
    "role" = "USER"
    "schema" = "SRC"
  },
]
到目前为止我已经尝试过的方法(似乎有效,但我正在寻找一种更简洁/可读的方法):

本地人{
#FlatMapping到字典列表。每个dict的格式为{schema=,role=,privilege=}
key_val=[对于变量roles中的角色:[对于架构,角色[“架构”]中的权限]:{
角色=角色[“名称”]
模式=模式
特权=特权
}]]
other_key_val=[对于扁平化中的dict(local.key_val):[对于dict中的priv[“privilege”]:{
role=dict[“role”]
schema=dict[“schema”]
特权
}]]
}
输出“输出”{
值=展平(本地。其他\u键\u值)
}

我的主要目标是让其他人更好地理解可读的代码。考虑到我第一次在Terraform中使用循环,我无法判断我的实现是否被认为是可读的。

也许这是一种更简单的方法来实现相同的结果:

locals {
  roles = [
      {
        name    = "LOADER"
        schemas = {
          RAW = ["USAGE", "ALL"]
          SRC = ["ALL"]
        }
      },
      {
        name    = "USER"
        schemas = {
          RAW = ["DELETE", "OBJECT"]
          SRC = ["USE"]
        }
      }
  ]

  out = flatten([
    for item in local.roles: [
      for schema, privileges in item.schemas: [
        for privilege in privileges: {
          role = item.name
          privilege = privilege
          schema = schema
        }
      ]
    ]
  ])
}
locals {
  roles = [
      {
        name    = "LOADER"
        schemas = {
          RAW = ["USAGE", "ALL"]
          SRC = ["ALL"]
        }
      },
      {
        name    = "USER"
        schemas = {
          RAW = ["DELETE", "OBJECT"]
          SRC = ["USE"]
        }
      }
  ]

  out = flatten([
    for item in local.roles: [
      for schema, privileges in item.schemas: [
        for privilege in privileges: {
          role = item.name
          privilege = privilege
          schema = schema
        }
      ]
    ]
  ])
}