Terraform如何使用嵌套for循环处理YAML数据实现for_each遍历
实现方案
你可以通过嵌套for循环先将YAML中的数据结构化处理为符合for_each要求的扁平Map格式,每个键对应唯一员工,值为你需要的details转换后的KV数组结构。
步骤1:处理YAML数据到目标结构
修改你的locals配置如下:
locals { ou_config = yamldecode(file("employees.yaml")) # 生成可直接用于for_each的Map,键为员工name(全局唯一),值为要求的details KV数组 employee_detail_map = merge([ # 第一层遍历Department数组 for dept_item in local.ou_config.Employees[0].Department : { # 第二层遍历部门(Dev/Ops)键值对 for dept_name, emp_list in dept_item : { # 第三层遍历单个部门下的所有员工 for emp in emp_list : emp.name => [ # 转换员工details为要求的KV对象数组 for k, v in emp.details : { key = k value = v } ] } } ]...) # 展开数组后用merge合并为单级Map }
如果存在不同部门员工重名的情况,可将上述代码中的键emp.name替换为"${dept_name}_${emp.name}"保证全局唯一。
步骤2:在for_each中使用处理后的数据
直接将上述local.employee_detail_map作为for_each的输入即可,每个迭代的each.value就是你需要的结构:
# 示例资源,替换为你实际使用的资源类型 resource "example_resource" "emp_attr" { for_each = local.employee_detail_map # 假设资源需要动态配置属性,用dynamic块遍历each.value dynamic "attribute" { for_each = each.value content { key = attribute.value.key value = attribute.value.value } } }
遍历顺序会按照员工在YAML中的顺序排列:第一位是danielf的details数组、第二位是johnb的details数组,后续依次是benol、pauld的对应结构。
内容的提问来源于stack exchange,提问作者Dani Wol.
相关产品推荐
相关产品推荐

