Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Terraform 在对象映射上循环_Terraform - Fatal编程技术网

Terraform 在对象映射上循环

Terraform 在对象映射上循环,terraform,Terraform,如何对以下各项执行循环 我想创建一个tfe\u变量node\u count&vm\u size。 我需要wksp1和wksp2中的这两个tfe_变量 variable "custom_variables" { type = map(object({ node_count = number vm_size = string })) default = { wksp1 = { node_count = 2 vm_size =

如何对以下各项执行
循环

我想创建一个
tfe\u变量
node\u count
&
vm\u size
。 我需要
wksp1
wksp2
中的这两个tfe_变量

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
}

你真的很接近!这里有几件事需要考虑:

选项1:多个
tfe_变量
资源

  • 为要创建的每个变量创建一个
    tfe\u变量
    资源
  • 确保
    custom_variables
    map中的键是工作区ID
  • 此选项的缺点是,每个变量都需要额外的资源

    选项2:可变对象列表

  • 定义每个变量的键、值和工作区ID的列表
  • 使用
    count
    迭代列表
  • 这种方法也有几个缺点:

    • 变量定义中存在大量重复代码
    • 该值必须始终为同一类型

    如果您在Terraform中挣扎于循环概念,可能会对您有所帮助。

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

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

    上面应该生成一个
    local.workspace\u variables
    ,如下所示:

    [
      { 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_变量
    实例有一个元素的要求,因此我们剩下的唯一工作是将其投影到一个映射中,为每个元素提供唯一标识符,并描述如何基于这些对象填充
    tfe_变量
    参数:

    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
    }
    

    有一件事我没有在上面讨论,因为这不是您直接提出的问题,那就是
    tfe\u变量中
    workspace\u id
    的值。如果我没记错的话,该参数需要的是工作区id而不是工作区名称,在这种情况下,
    workspace\u id
    参数可能需要稍微复杂一点的表达式。如果您已经有一个
    tfe_工作区
    资源使用工作区名称作为键,那么类似的操作可能会起作用,例如:

      workspace_id = tfe_workspace.example[each.value.workspace].id
    

    如果您的工作区是以不同的方式创建的,那么您可能需要在这里做一些更复杂的事情,但这与您最初问题的主题相去甚远,因此我不会在这里深入探讨。如果你愿意的话,我很乐意在这个网站上用一个单独的问题来帮助你。

    无论如何,我不需要硬编码计划中的键“node\u count”和“vm\u size”。例如,如果我只是在稍后使用新变量更新自定义变量,我会使用一个替代选项更新答案。不幸的是,这种方法也有缺点,但我看不到最佳方法。
    [
      { 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" },
    ]
    
    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_id = tfe_workspace.example[each.value.workspace].id