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

Terraform实现嵌套路径列表生成以在Azure Data Lake Gen2中创建嵌套目录

Terraform实现嵌套路径列表生成以在Azure Data Lake Gen2中创建嵌套目录

我来帮你搞定这个嵌套目录路径生成的问题!你需要把这种嵌套的Map结构转换成扁平化的路径列表,Terraform的本地值(locals)加上内置函数就能实现这个需求,核心思路是递归遍历你的输入Map,逐层拼接路径。

下面是完整的实现代码,我会一步步拆解逻辑:

variable "input_list" {
  type = map(map(any))
  default = {
    "a" = {
      "a1" = {}
      "a2" = {}
    }
    "b" = {
      "b1" = {}
      "b2" = {
        "b21" = {}
      }
    }
  }
}

locals {
  # 定义递归函数:遍历嵌套Map,生成层级路径
  nested_paths = func(current_map, parent_path) {
    return flatten([
      for key, value in current_map :
      merge(
        # 如果当前值是非空嵌套Map,继续递归遍历
        can(value) && length(value) > 0 ? local.nested_paths(value, "${parent_path}/${key}") : [],
        # 如果当前值是空Map(叶子节点),生成最终路径并去掉开头多余的斜杠
        [trim("${parent_path}/${key}", "/")]
      )
    ])
  }

  # 调用递归函数,初始父路径为空字符串,最终转成Map用于for_each
  paths = tomap({
    for path in local.nested_paths(var.input_list, "") :
    path => path
  })
}

resource "azurerm_storage_data_lake_gen2_path" "example" {
  for_each           = local.paths
  path               = each.value
  filesystem_name    = azurerm_storage_data_lake_gen2_filesystem.example.name
  storage_account_id = azurerm_storage_account.example.id
  resource           = "directory"
}

逻辑拆解:

  1. 递归函数nested_paths:

    • 接收两个参数:当前遍历的current_map和已经拼接好的parent_path
    • 遍历Map中的每个键值对:
      • 如果值是非空的嵌套Map,就递归调用自身,把当前键拼接到父路径后面继续处理
      • 如果值是空Map(代表这是最后一级目录),就生成完整路径,并用trim去掉开头的斜杠(避免出现/a/a1这种不符合ADLS要求的格式)
    • 用flatten把所有嵌套的列表合并成一个一维路径列表
  2. 转成Map用于for_each:
    Terraform的for_each要求使用Map类型,所以我们把生成的路径列表转成键值相同的Map,这样每个路径都是唯一的键,确保资源创建不会出现重复或冲突。

测试验证:

对于你给出的input_list,local.paths最终会生成这样的Map:

{
  "a/a1" = "a/a1"
  "a/a2" = "a/a2"
  "b/b1" = "b/b1"
  "b/b2/b21" = "b/b2/b21"
}

完全匹配你想要的new_list结果,这样就能正确创建所有嵌套目录了。

备注:内容来源于stack exchange,提问作者gr00t

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 10:18:03