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
相关产品推荐
相关产品推荐

