Terraform无dynamic block支持时,如何基于嵌套对象创建grafana_dashboard?
解决Grafana Dashboard资源不支持Dynamic Block的重复配置问题
你需要基于嵌套对象批量创建Grafana Dashboard,但grafana_dashboard资源不支持dynamic块,常规的dynamic写法无法生效,同时希望避免重复配置。
你的变量配置示例:
dashboards = { "Test Dashboards" = { folder_name = "Test Folder" dashboards = [ { file = "test.json" overwrite = true }, { file = "test1.json" overwrite = false } ] } }
常规的dynamic块写法在这里无效,因为grafana_dashboard资源本身的设计是每个资源实例对应一个单独的仪表盘,而非一个资源下包含多个仪表盘。最优解决方案是先扁平化嵌套的变量结构,再通过for_each遍历每个单独的仪表盘来创建资源。
具体步骤:
- 扁平化变量数据结构
通过Terraform内置函数将嵌套的配置转换成扁平映射,让每个仪表盘拥有唯一标识和完整配置:
locals { flat_dashboards = merge([ for group_name, group in var.dashboards : { for idx, dashboard in group.dashboards : "${group_name}-${idx}" => { folder_name = group.folder_name file = dashboard.file overwrite = dashboard.overwrite } } ]...) }
这段代码通过双层循环遍历所有仪表盘组和组内的仪表盘,用组名-索引作为每个仪表盘的唯一键,将文件夹、文件路径、覆盖设置等整合到单个对象中,最终合并成一个扁平的映射结构。
- 基于扁平结构创建资源
直接遍历扁平化后的本地值,为每个仪表盘创建独立的grafana_dashboard实例:
resource "grafana_dashboard" "dashboards" { for_each = local.flat_dashboards folder = each.value.folder_name config_json = file("../../dashboards/${each.value.file}") overwrite = each.value.overwrite }
方案优势:
- 完全适配
grafana_dashboard资源的设计逻辑,避免因不支持dynamic块导致的错误 - 无需重复编写文件夹等共享配置,所有分组内的仪表盘自动继承对应文件夹设置
- 每个仪表盘都是独立的资源实例,便于单独管理(比如单独更新或销毁某个仪表盘)
内容的提问来源于stack exchange,提问作者Andrew Mitchell
相关产品推荐
相关产品推荐

