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

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遍历每个单独的仪表盘来创建资源。

具体步骤:

  1. 扁平化变量数据结构
    通过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
        }
    }
  ]...)
}

这段代码通过双层循环遍历所有仪表盘组和组内的仪表盘,用组名-索引作为每个仪表盘的唯一键,将文件夹、文件路径、覆盖设置等整合到单个对象中,最终合并成一个扁平的映射结构。

  1. 基于扁平结构创建资源
    直接遍历扁平化后的本地值,为每个仪表盘创建独立的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:47:34