首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遍历对象映射

遍历对象映射
EN

Stack Overflow用户
提问于 2020-05-18 20:14:27
回答 2查看 3.9K关注 0票数 3

如何对以下内容执行for_each循环?

我想创建一个tfe_variable node_count & vm_size。我需要这两个tfe_variables,wksp1wksp2

代码语言:javascript
复制
variable "custom_variables" {
  type = map(object({
    node_count = number
    vm_size    = string
  }))

  default = {
    wksp1 = {
      node_count = 2
      vm_size    = "Standard_D2_v3"
    },
    wksp2 = {
      node_count = 5
      vm_size    = "Standard_D2_v5"
    }
  }
}

resource "tfe_variable" "custom" {
  for_each = {
    # for each workspace & variable in var.custom_variables create a tfe_variable
  }

  key          = each.value.name
  value        = each.value.value
  category     = "terraform"
  workspace_id = each.value.workspace_id
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-20 18:59:09

记住for_each的主要要求是,我们总是需要创建一个映射,该映射对于我们想要创建的资源的每个实例都有一个元素。在本例中,这意味着您需要一个每个变量都有一个元素的映射,因为tfe_variable描述了单个工作区上的一个变量。

然后,我们的工作是编写一个表达式,将通过变量传入的对象映射值投影到每个变量都有一个单独元素的集合中。这里有一种方法可以做到这一点,使用函数的方式类似于文档中的一个例子

代码语言:javascript
复制
locals {
  workspace_variables = flatten([
    for ws_name, ws in var.custom_variables : [
      for var_name, value in ws : {
        workspace = ws_name
        variable  = var_name
        value     = value
      }
    ]
  ])
}

上面的内容应该生成如下所示的local.workspace_variables

代码语言:javascript
复制
[
  { workspace = "wksp1", variable = "node_count", value = 2 },
  { workspace = "wksp1", variable = "vm_size", value = "Standard_D2_v3" },
  { workspace = "wksp2", variable = "node_count", value = 5 },
  { workspace = "wksp2", variable = "vm_size", value = "Standard_D2_v5" },
]

现在,这满足了每个所需的tfe_variable实例都有一个元素的要求,因此我们剩下的唯一工作就是将其投影到一个映射中,为每个元素提供唯一标识符,并描述如何基于这些对象填充tfe_variable参数:

代码语言:javascript
复制
resource "tfe_variable" "custom" {
  for_each = {
    for wsv in local.workspace_variables : "${wsv.workspace}.${wsv.variable}" => wsv
  }

  key          = each.value.variable
  value        = each.value.value
  category     = "terraform"
  workspace_id = each.value.workspace
}

有一件事我在上面没有争论,因为这不是你直接提出的问题,那就是workspace_idtfe_variable中的价值。如果我没记错的话,这个参数是期望一个工作区id,而不是一个工作区名称,在这种情况下,您可能需要一个稍微复杂一些的workspace_id参数表达式。如果您已经有了一个使用工作区名称作为键的tfe_workspace资源,那么类似这样的东西可能会起作用,例如:

代码语言:javascript
复制
  workspace_id = tfe_workspace.example[each.value.workspace].id

如果您的工作空间是以不同的方式创建的,那么您可能需要在这里做一些更复杂的事情,但这与您最初问题的主题相去甚远,所以我不打算在这里深入研究。如果你愿意的话,我很乐意在这个网站的另一个问题上帮助它。

票数 1
EN

Stack Overflow用户

发布于 2020-05-18 23:55:58

你真的很接近!下面是几件需要考虑的事情:

选项1:多个

  1. 为要创建的每个变量创建一个tfe_variable资源
  2. 确保您的custom_variables映射中的键是工作区ID。
代码语言:javascript
复制
variable "custom_variables" {
  type = map(object({
    node_count = number
    vm_size    = string
  }))

  default = {
    wksp1_id = {
      node_count = 2
      vm_size    = "Standard_D2_v3"
    },
    wksp2_id = {
      node_count = 5
      vm_size    = "Standard_D2_v5"
    }
  }
}

resource "tfe_variable" "node_count" {
  for_each = var.custom_variables

  key          = "node_count"
  value        = each.value.node_count
  category     = "terraform"
  workspace_id = each.key
}

resource "tfe_variable" "vm_size" {
  for_each = var.custom_variables

  key          = "vm_size"
  value        = each.value.vm_size
  category     = "terraform"
  workspace_id = each.key
}

此选项的缺点是,每个变量都需要额外的资源。

选项2:可变对象列表()

  1. 定义每个变量的键、值和工作区ID的列表。
  2. 使用count迭代列表
代码语言:javascript
复制
variable "custom_variables" {
  type = list(object({
    key          = string
    value        = string
    workspace_id = string
  }))
  default = [
    {
      key          = "node_count"
      value        = "2"
      workspace_id = "wksp1_id"
    },
    {
      key          = "node_count"
      value        = "5"
      workspace_id = "wksp2_id"
    },
    {
      key          = "vm_size"
      value        = "Standard_D2_v3"
      workspace_id = "wksp1_id"
    },
    {
      key          = "vm_size"
      value        = "Standard_D2_v5"
      workspace_id = "wksp2_id"
    }
  ]
}

resource "tfe_variable" "custom" {
  count = length(var.custom_variables)

  key          = var.custom_variables[count.index].key
  value        = var.custom_variables[count.index].value
  workspace_id = var.custom_variables[count.index].workspace_id
  category     = "terraform"
}

这种方法也有一些缺点:

  • 变量定义中有相当数量的重复代码。
  • 值必须始终是相同类型的。

如果您正在与Terraform中的循环概念进行斗争,这篇博客文章可能会对您有所帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61878210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档