【问题标题】:Looking for a more concise way of doing a nested loop寻找一种更简洁的嵌套循环方式
【发布时间】:2021-03-24 12:42:00
【问题描述】:

寻找一种更简洁/更易读的方式来实现 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"
  },
]

到目前为止我所尝试的(似乎有效,但我正在寻找一种更简洁/可读的方式来做到这一点):

locals {
  # FlatMapping to a list of dictionaries. Each dict in the form of {schema=<schema>, role=<role>, privilege=<privilege>}
  key_val       = [for role in var.roles : [for schema, privilege in role["schemas"]: {
    role      = role["name"]
    schema    = schema
    privilege = privilege
  }]]
  other_key_val = [for dict in flatten(local.key_val): [for priv in dict["privilege"]: {
    role      = dict["role"]
    schema    = dict["schema"]
    privilege = priv
  }]]
}

output "output" {
  value = flatten(local.other_key_val)
}

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

【问题讨论】:

    标签: terraform hcl


    【解决方案1】:

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

    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
            }
          ]
        ]
      ])
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多