如何用Terraform在单个Datadog仪表盘中循环遍历服务器别名
解决Terraform单Datadog仪表板整合多服务器指标的问题
要在单个Datadog仪表板中整合多台服务器的指标,不能在datadog_dashboard资源上使用for_each(这会生成多个独立仪表板),而是要利用Terraform的**动态块(dynamic block)**在仪表板内部循环生成对应服务器的查询和公式配置。
修改后的配置示例
变量定义(保持不变)
variable "africa" { type = map(any) default = { "server1" = { alias = "server1" hostname = "hostname1" name = "query1" formula_expression = "query1 * 8" } "server2" = { alias = "server2" hostname = "hostname2" name = "query2" formula_expression = "query2 * 8" } "server3" = { alias = "server3" hostname = "hostname3" name = "query3" formula_expression = "query3 * 8" } } }
仪表板资源配置(关键修改)
resource "datadog_dashboard" "global_dashboards_africa" { title = "Terraform - Africa" description = "Dashboards for Global" layout_type = "ordered" widget { group_definition { title = "Quick Overview" show_title = true layout_type = "ordered" widget { timeseries_definition { title = "Traffic" title_size = "16" title_align = "left" show_legend = false legend_layout = "auto" legend_columns = ["avg", "min", "max", "value", "sum"] # 动态生成每个服务器的request块 dynamic "request" { for_each = var.africa content { formula { alias = request.value.alias formula_expression = request.value.formula_expression } query { metric_query { name = request.value.name query = "max:system.net.bytes_sent{device:bond0,host:${request.value.hostname}}" } } style { palette = "warm" line_type = "solid" line_width = "normal" } display_type = "area" } } yaxis { include_zero = true scale = "linear" min = "auto" max = "auto" } } widget_layout { x = 0 y = 5 width = 12 height = 5 } } } } }
关键说明
- 动态块的作用:
dynamic "request"会遍历var.africa中的每台服务器,为每台服务器生成一个独立的request块,包含对应的查询、公式和样式配置,所有这些都会被整合到同一个时间序列图表中。 - 变量引用方式:在动态块内部,通过
request.value访问当前迭代的服务器对象属性(如request.value.hostname),确保每个查询对应正确的服务器主机名。 - 避免资源级循环:不在
datadog_dashboard资源上使用for_each,保证只生成一个仪表板实例,所有服务器的指标都集中在这个仪表板的指定图表里。
内容的提问来源于stack exchange,提问作者cloud110
相关产品推荐
相关产品推荐

