Terraform Datadog仪表盘配置如何复用相似widget块并保留顺序?
最优方案:单动态块遍历结构化配置列表
该方案可完全保留widget原有顺序,仅需写1次组件逻辑,无重复代码。
实现思路
将所有widget的配置统一存入结构化的local变量,为每个条目增加类型标记,动态块内部根据类型渲染对应结构的widget即可。
locals { dashboard_widgets = [ # 前两个时间序列图表 { type = "alert_graph" alert_id = "895605" viz_type = "timeseries" title = "Widget Title" live_span = "1h" }, { type = "alert_graph" alert_id = "895605" viz_type = "timeseries" title = "Widget Title" live_span = "2h" }, # 中间特殊数值组件 { type = "alert_value" alert_id = "895605" precision = 3 unit = "b" text_align = "center" title = "Widget Title" }, # 后两个时间序列图表 { type = "alert_graph" alert_id = "895605" viz_type = "timeseries" title = "Widget Title" live_span = "1w" }, { type = "alert_graph" alert_id = "895605" viz_type = "timeseries" title = "Widget Title" live_span = "2w" } ] } resource "datadog_dashboard" "ordered_dashboard" { title = "Ordered Layout Dashboard" description = "Created using the Datadog provider in Terraform" layout_type = "ordered" is_read_only = true dynamic "widget" { for_each = local.dashboard_widgets content { # 按类型渲染不同组件 dynamic "alert_graph_definition" { for_each = widget.value.type == "alert_graph" ? [widget.value] : [] content { alert_id = alert_graph_definition.value.alert_id viz_type = alert_graph_definition.value.viz_type title = alert_graph_definition.value.title live_span = alert_graph_definition.value.live_span } } dynamic "alert_value_definition" { for_each = widget.value.type == "alert_value" ? [widget.value] : [] content { alert_id = alert_value_definition.value.alert_id precision = alert_value_definition.value.precision unit = alert_value_definition.value.unit text_align = alert_value_definition.value.text_align title = alert_value_definition.value.title } } } } }
方案优势
- 完全保留原始widget顺序,local列表的顺序就是仪表盘最终渲染的顺序
- 无重复的组件逻辑代码,新增同类型组件仅需在local列表增加对应条目
- 后续扩展其他widget类型仅需新增对应的内层动态块即可
生产场景进阶优化
如果组件数量多、公共参数重复度高,可进一步简化配置:
locals { # 提取公共参数,修改时仅需改一处 common_alert_params = { alert_id = "895605" viz_type = "timeseries" title = "Widget Title" } # 批量生成所有时间序列组件配置 alert_graph_widgets = [ for span in ["1h", "2h", "1w", "2w"] : merge(local.common_alert_params, {type = "alert_graph", live_span = span}) ] # 特殊数值组件配置 alert_value_widget = { type = "alert_value" alert_id = "895605" precision = 3 unit = "b" text_align = "center" title = "Widget Title" } # 按顺序拼接最终widget列表 dashboard_widgets = concat( slice(local.alert_graph_widgets, 0, 2), [local.alert_value_widget], slice(local.alert_graph_widgets, 2, 4) ) }
内容的提问来源于stack exchange,提问作者TuanDT
相关产品推荐
相关产品推荐

