Terraform如何在output.tf中基于模板高效生成自定义命名配置文件
Terraform批量渲染模板生成文件的精简实现方案
方案1:直接使用template_dir资源
你找到的template_dir本身就是对应这个场景的最优解,它会自动递归渲染源目录下的所有模板文件,完整保留目录结构输出到目标路径,无需逐个声明模板和文件资源。
配置示例:
terraform { required_providers { template = { source = "hashicorp/template" version = "~> 2.2.0" } } } resource "template_dir" "project_config" { source_dir = "${path.module}/templates/proyect-name/" destination_dir = "${var.outputs_final_path}/${var.example_name}/" # 所有模板需要用到的变量统一在此声明,所有模板可直接调用 vars = { example_name = var.example_name # 其他变量按需添加即可 } }
如果需要自定义输出文件名的前缀/后缀规则,可以先将源模板文件命名为通用名称,渲染后会自动输出到目标路径,无需额外配置。
注意:hashicorp/template provider已经官方废弃,如果你使用的是Terraform 0.12+版本,更推荐使用下面的原生函数方案。
方案2:fileset + templatefile + for_each批量生成(官方推荐,适配高版本)
该方案使用Terraform原生函数实现,无需依赖废弃的provider,灵活度更高,完全可以自定义文件名和目录规则,不管有多少个模板文件,只需要写一次配置即可。
配置示例:
terraform { required_providers { local = { source = "hashicorp/local" version = "~> 2.4.0" } } } # 遍历获取模板目录下所有yml格式的模板文件路径 locals { template_paths = fileset("${path.module}/templates/proyect-name/", "**/*.yml") } # 批量渲染模板并生成对应文件 resource "local_file" "project_config" { for_each = toset(local.template_paths) # 渲染模板内容,所有变量统一传入 content = templatefile("${path.module}/templates/proyect-name/${each.value}", { example_name = var.example_name # 其他需要传入模板的变量统一在这里添加 }) # 自定义输出文件名规则,示例实现了原文件名前加变量前缀的要求 filename = "${var.outputs_final_path}/${var.example_name}/${var.example_name}_${basename(each.value)}" }
方案优势:
- 无废弃依赖,适配所有Terraform 0.12+版本
- 代码量极低,新增模板无需修改Terraform代码,放入对应模板目录即可自动识别生成
- 灵活度极高,可随意调整目录结构、文件名规则、变量传递逻辑
内容的提问来源于stack exchange,提问作者naeroy
相关产品推荐
相关产品推荐

