【问题标题】:Terraform for iterate through nested lists用于遍历嵌套列表的 Terraform
【发布时间】:2021-11-27 14:35:30
【问题描述】:

我在 yaml 文件中定义了资源输入,在 main.tf 中我使用 yamldecode 来检索资源属性。一般来说,当我有角色“roles:ADMIN”的字符串值时,它会起作用。但是我需要根据角色中定义的列表值来迭代我的资源。请指教。

我尝试了 terraform "count" 参数,但出现如下错误

错误:“count”和“for_each”的组合无效 │ │ 在 main.tf 第 214 行,在资源“snowflake_schema_g​​rant”“grant”中: │ 214: for_each = { for ac in local.acs : ac.databasename => ac } │ │ "count" 和 "for_each" 元参数是互斥的,只能使用一个来明确要创建的资源数量。

 grants:
  - schemaname: SCHEMA1
    databasename: DEMO
    privilege:  MODIFY
    roles: [ADMIN,SYSADMIN]
  
  - schemaname: SCHEMA2
    databasename: DEMO
    privilege:  USAGE
    roles: [USER1,USER2]


locals {
        acs = yamldecode(file("./access.yaml"))
      }
resource "snowflake_schema_grant" "grant" {
          for_each = { for ac in local.acs.grants : ac.schemaname => ac }
          #count = length(each.value.privilege)           
          database_name     = each.value.databasename
          schema_name  = each.value.schemaname
          privilege = each.value.privilege
          roles    = each.value.roles 
 }
     

我想运行我的资源迭代 4 次,如下所示

  • DEMO、SCHEMA1、修改、AMDIN
  • DEMO、SCHEMA1、修改、系统管理员
  • DEMO,SCHEMA2, USAGE, USER1
  • DEMO、SCHEMA2、USAGE、USER2

【问题讨论】:

  • “计数或加入不起作用” - 这是什么意思?有什么错误吗? schemagrants 是什么?
  • @Marcin 抱歉,我现在已经简化了。希望现在问题清楚了吗?
  • 你确定这是你的正确 yaml 吗?因为后半部分完全覆盖了前半部分。
  • @Marcin 你是对的,我复制了错误的 yaml。请查看以一个角色工作的 yaml 的图像。但如果列表提供给角色,我想重复资源
  • 我注意到您几乎所有的问题都得到了回答,但只有两个答案被接受。接受有用的答案不仅是一种好习惯,而且可以减少重复并增加您的问题得到实际回答的机会。

标签: terraform snowflake-cloud-data-platform


【解决方案1】:

您的预期输出令人困惑。例如,它包含TESTSCH,它不属于您的 yaml。您的 yaml 有 SCHEMA2 根本没有使用。所以我只能猜你想做什么。

无论如何,您必须将您的双循环展平,变成一个for_each。这可以按如下方式完成:

locals {
    acs = yamldecode(file("./access.yaml"))
        
    acs_flat = merge([
            for idx, ac in local.acs["grants"]:
             {
                 for role in ac["roles"]:
                   "${idx}-${role}" => {
                       schemaname = ac["schemaname"]
                       role = role
                       privilege =  ac["privilege"]
                       databasename =  ac["databasename"]
                   }
             }
            
        ]...)    
        
}

resource "snowflake_schema_grant" "grant" {
      for_each      = local.acs_flat       
      database_name = each.value.databasename
      schema_name   = each.value.schemaname
      privilege     = each.value.privilege
      roles         = [each.value.role]
 }

【讨论】:

    猜你喜欢
    • 2021-04-10
    • 2019-08-22
    • 2015-05-16
    • 2019-03-21
    • 1970-01-01
    • 2015-12-06
    • 2021-09-19
    • 2021-10-30
    相关资源
    最近更新 更多