【问题标题】:Iterate through a conditional for_each map of strings遍历字符串的条件 for_each 映射
【发布时间】:2021-05-26 05:23:24
【问题描述】:

试图将一些东西放在一起以通过 tfe 插件的限制。

我有 200 多个工作区,我使用 Terraform Cloud 中的一个需要更新的变量来管理它们。在这种情况下,我需要更新的所有工作空间都以“dev-workspace”开头。

我有一个包含以下内容的数据块:

data "tfe_workspace_ids" "all" {
  names        = ["*"]
  organization = "myorganization"
}

由于模块的限制,我无法对这些工作区进行通配符搜索。此数据块返回一个字符串映射,其中包含我的 所有 个工作区:

aa = {
    "dev-workspace-1"                   = "ws-anonymized"
    "dev-workspace-2"                   = "ws-ws-anonymized"
    "dev-workspace-3"                   = "ws-ws-anonymized"
    "test-workspace-1"                  = "ws-ws-anonymized"
    "prod-workspace-1"                  = "ws-ws-anonymized"
}

我的问题是我需要获取此字符串映射并将其过滤以仅返回键中包含“dev-workspace”的字符串。我尝试过类似以下的方法:

resource "tfe_variable" "dev-workspace" {
  for_each = contains(data.tfe_workspace_ids.all.ids, "dev-workspace")

  key = "access_key"
  value = "XXXX"
  category = "terraform"
  workspace_id = each.value
  sensitive = true
  description = "AWS IAM secret access key."
}

但您似乎不能以这种方式将containsfor_each 一起使用:

Error: Error in function call

  on main.tf line 16, in resource "tfe_variable" "dev-workspace":
  16:   for_each = contains(data.tfe_workspace_ids.all.ids, "dev-workspace")
    |----------------
    | data.tfe_workspace_ids.all.ids is map of string with 284 elements

Call to function "contains" failed: argument must be list, tuple, or set.

我不太确定在这里做什么,但是已经尝试了几种方法,但无法弄清楚。感谢您的帮助。

【问题讨论】:

    标签: terraform terraform-cloud


    【解决方案1】:

    如果您想过滤,您的资源可能是(您必须将var.aa 更改为生成输入映射的data.tfe_workspace_ids 的值):

    
    variable "aa" {
    
      default = {
          "dev-workspace-1"                   = "ws-anonymized"
          "dev-workspace-2"                   = "ws-ws-anonymized"
          "dev-workspace-3"                   = "ws-ws-anonymized"
          "test-workspace-1"                  = "ws-ws-anonymized"
          "prod-workspace-1"                  = "ws-ws-anonymized"
      }
    }
    
    resource "tfe_variable" "dev-workspace" {
    
      for_each = {for k, v in var.aa:
                  k => v if length(regexall("dev-workspace", k)) > 0}
    
      key = "access_key"
      value = "XXXX"
      category = "terraform"
      workspace_id = each.value
      sensitive = true
      description = "AWS IAM secret access key."
    }
    

    【讨论】:

    • 这非常有效。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 2020-01-21
    • 2012-05-14
    • 2018-05-15
    相关资源
    最近更新 更多