簡體   English   中英

如何使用 Terraform for 循環訪問 map 字典列表中的鍵和值

[英]how to access keys and values from list of map dictionary using Terraform for loop

我試了這么多,但不知道該怎么做。 我下面有一個 YAML 文件。

---
project_team_mapping:
- Terraform-Project-1:                      ## this is project name
    - team_name: example-team-1
      roles:
        - GROUP_READ_ONLY
        - GROUP_DATA_ACCESS_READ_WRITE
    - team_name: example-team-2
      roles:
        - GROUP_READ_ONLY
        - GROUP_DATA_ACCESS_READ_WRITE
- Terraform-Project-2:                       ## this is 2nd project name
    - team_name: example-team-3
      roles:
        - GROUP_READ_ONLY
        - GROUP_DATA_ACCESS_READ_WRITE
    - team_name: example-team-4
      roles:
        - GROUP_READ_ONLY
        - GROUP_DATA_ACCESS_READ_WRITE

我正在使用一些 TF 模塊解碼 YAML 文件,這里是模塊和 YAML 解碼 output JSON。

module "yaml_json_multidecoder" {
  source  = "levmel/yaml_json/multidecoder"
  version = "0.2.1"
  filepaths = ["./examples/*.yaml"]
}

output "project_team_mapping" {
  value = module.yaml_json_multidecoder.files.project.project_team_mapping
}

下面是使用上述解碼器模塊時的 output。

project_team_mapping = [
  {
    "Terraform-Project-1" = [
      {
        "roles" = [
          "GROUP_READ_ONLY",
          "GROUP_DATA_ACCESS_READ_WRITE",
        ]
        "team_name" = "dx-example-team-3"
      },
      {
        "roles" = [
          "GROUP_READ_ONLY",
          "GROUP_DATA_ACCESS_READ_WRITE",
        ]
        "team_name" = "dx-example-team-4"
      },
    ]
  }
]

我想使用 Terraform for/for_each function 和下面特定資源塊的動態函數創建資源,但我無法理解結果。

下面是要使用的資源塊

resource "mongodbatlas_project" "test" {
  name   = "project-name"
  org_id = "<ORG_ID>"
  project_owner_id = "<OWNER_ACCOUNT_ID>"

 # want to use dynamic function here to create multiple teams
  teams {
    team_id    = "5e0fa8c99ccf641c722fe645"
    role_names = ["GROUP_OWNER"]

  }

}

有人可以幫忙嗎?

resource "mongodbatlas_project" "test" {
  name   = "project-name"
  org_id = "<ORG_ID>"
  project_owner_id = "<OWNER_ACCOUNT_ID>"

 # want to use dynamic function here to create multiple teams
  teams {
    team_id    = "5e0fa8c99ccf641c722fe645"
    role_names = ["GROUP_OWNER"]

  }

}

我可能使用了錯誤的 YAML 結構,請建議適合我需要的結構。 我可以更改 YAML。

上面的問題我在 YAML 中使用 team_name 但資源塊采用 team_id。 我打算使用數據 function 來獲取 ID,但如果您碰巧有一個簡單的解決方案,請提出建議

你留下了許多未知數。 但最好的猜測是下面的例子。 假設您已將 yaml 解碼為local.decodedyaml 此外,您可能需要team_id而不是team_name ,也許您可以通過數據源加載它們,或者必須手動檢索並添加到 yaml。

resource "mongodbatlas_project" "test" {
  for_each = local.decodedyaml.project_team_mapping

  name   = each.key
  org_id = "<ORG_ID>"
  project_owner_id = "<OWNER_ACCOUNT_ID>"

  dynamic "teams" {
    for_each = {
      for team in each.value: team.team_name => team.roles
    }

    content {
      team_id = each.key
      role_names = each.value
    }
  }
}

如果您將數據設計更改為“展開”初始列表,這將起作用:而不是

project_team_mapping:
- Terraform-Project Name-1:                      ## this is project name
    - team_name: example-team-1
      roles:
        - GROUP_READ_ONLY
        - GROUP_DATA_ACCESS_READ_WRITE
    ...
- Terraform-Project Name-2:                       ## this is 2nd project name
    - team_name: example-team-3
      roles:
        - GROUP_READ_ONLY
        - GROUP_DATA_ACCESS_READ_WRITE
    ...

利用

project_team_mapping:
  Terraform-Project Name-1:                      ## this is project name
    - team_name: example-team-1
      roles:
        - GROUP_READ_ONLY
        - GROUP_DATA_ACCESS_READ_WRITE
    ...
  Terraform-Project Name-2:                       ## this is 2nd project name
    - team_name: example-team-3
      roles:
        - GROUP_READ_ONLY
        - GROUP_DATA_ACCESS_READ_WRITE
    ...

這簡化了數據結構並大大簡化了 hcl 解析。

最后,我不確定帶空格的 yaml 鍵是否是無風險的嘗試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM