You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform中实现带条件嵌套循环创建jamf_smartComputerGroup资源

问题描述

我是Terraform纯新手,遇到如下问题:

需要创建多个同类型资源,该资源示例如下:

resource "jamf_smartComputerGroup" "test_smart_1" {
  name = "Test Smart 1"
  criteria {
    priority = 0
    name = "UDID"
    search_type = "is"
    search_value = "FAKE-UDID-THAT-ALSO-DOES-NOT-EXIST"
  }
  criteria {
    priority = 1
    name = "UDID"
    search_type = "is not"
    search_value = "FAKE-UDID-THAT-DOES-NOT-EXIST-LIKE-REALLY"
  }
}

重要说明:该资源可包含0个或多个criteria!

我已创建variables.tf和terraform.tfvars文件,内容如下:

variables.tf

variable "jamf_smartComputerGroup_list" {
  type = list(object({
    SMCG_NAME = string
    SMCG_CRITERIA = list(object({
      SMCG_CRITERIA_PRIORITY  = number
      SMCG_CRITERIA_NAME      = string
      SMCG_CRITERIA_TYPE      = string
      SMCG_CRITERIA_VALUE     = string
    }))
  }))
}

terraform.tfvars

jamf_smartComputerGroup_list = [
  {
    SMCG_NAME     = "smcg_1"
    SMCG_CRITERIA = []                      # 该对象无criteria
  },
  {
    SMCG_NAME = "smcg_2"
    SMCG_CRITERIA = [                       # 该对象有1个criteria
      {
        SMCG_CRITERIA_PRIORITY  = 0
        SMCG_CRITERIA_NAME      = "crit"
        SMCG_CRITERIA_TYPE      = "is not"
        SMCG_CRITERIA_VALUE     = "false"
      }
    ]
  },
  {
    SMCG_NAME = "smcg_3"
    SMCG_CRITERIA = [                       # 该对象有2个criteria
      {
        SMCG_CRITERIA_PRIORITY  = 0
        SMCG_CRITERIA_NAME      = "crit 1"
        SMCG_CRITERIA_TYPE      = "contains"
        SMCG_CRITERIA_VALUE     = "foo"
      },
      {
        SMCG_CRITERIA_PRIORITY  = 1
        SMCG_CRITERIA_NAME      = "crit 2"
        SMCG_CRITERIA_TYPE      = "exact match"
        SMCG_CRITERIA_VALUE     = "bar"
      }
    ]
  }
]

我已经在main.tf中实现了不带criteria的资源循环创建,代码如下:

resource "jamf_smartComputerGroup" "default" {
  for_each = { for idx, val in var.jamf_smartComputerGroup_list : idx => val }
  name     = each.value.SMCG_NAME
}

但我不知道怎么判断是否存在criteria,以及如何循环处理这些criteria。我了解到不能同时使用两个for_each,也不能混合count和for_each。希望能得到示例代码!

此致,
Emmanuel Canault


解决方案:使用Terraform动态块处理嵌套列表

你需要用Terraform的dynamic块来处理每个资源下的多个criteria,动态块会自动根据列表内容生成对应数量的嵌套块,空列表则不生成任何块,完美匹配你的需求。

修改后的main.tf代码如下:

resource "jamf_smartComputerGroup" "default" {
  # 用资源名称作为for_each的key,比索引更直观,避免索引变动导致资源重建
  for_each = { for item in var.jamf_smartComputerGroup_list : item.SMCG_NAME => item }
  name     = each.value.SMCG_NAME

  # 动态生成criteria块
  dynamic "criteria" {
    # 遍历当前资源对应的criteria列表
    for_each = each.value.SMCG_CRITERIA
    content {
      priority     = criteria.value.SMCG_CRITERIA_PRIORITY
      name         = criteria.value.SMCG_CRITERIA_NAME
      search_type  = criteria.value.SMCG_CRITERIA_TYPE
      search_value = criteria.value.SMCG_CRITERIA_VALUE
    }
  }
}

关键说明:

  • for_each优化:将原索引key替换为资源名称SMCG_NAME,资源标识符更清晰,避免因列表顺序变化触发不必要的资源重建。
  • 动态块自动适配:当SMCG_CRITERIA为空列表时,dynamic块不会生成任何criteria嵌套块;当列表有内容时,会自动生成对应数量的criteria块。
  • 属性映射:通过criteria.value访问当前遍历的单个criteria对象,直接映射到资源的对应属性。

这样修改后,就能一次性创建所有包含0/1/2个criteria的智能电脑组了。


内容的提问来源于stack exchange,提问作者Emmanuel Canault

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:50:27