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" }
逻辑拆解:
递归函数
nested_paths:- 接收两个参数:当前遍历的
current_map和已经拼接好的parent_path - 遍历Map中的每个键值对:
- 如果值是非空的嵌套Map,就递归调用自身,把当前键拼接到父路径后面继续处理
- 如果值是空Map(代表这是最后一级目录),就生成完整路径,并用
trim去掉开头的斜杠(避免出现/a/a1这种不符合ADLS要求的格式)
- 用
flatten把所有嵌套的列表合并成一个一维路径列表
- 接收两个参数:当前遍历的
转成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
相关产品推荐
相关产品推荐

