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

如何在Terraform中用for_each循环为服务器与磁盘组合创建资源

解决方案

要实现服务器与磁盘的组合遍历,需要先将嵌套的服务器-磁盘结构扁平化,生成包含4个独立组合的集合,再以此作为for_each的数据源。具体操作如下:

  1. 新增扁平化本地变量,拆分每个服务器的磁盘组合:
locals {
  servers = [
    {
      "Environment": "UAT",
      "ServerName": "WebServer01",
      "Disks": [
        "C:",
        "D:"
      ],
    },
    {
      "Environment": "UAT",
      "ServerName": "WebServer02",
      "Disks": [
        "C:",
        "D:"
      ],
    }
  ]

  # 生成服务器-磁盘的独立组合,共4个条目
  server_disk_pairs = merge([
    for server in local.servers : {
      for disk in server.Disks :
      "${server.ServerName}-${disk}" => {
        server_name = server.ServerName
        disk        = disk
      }
    }
  ]...)
}
  1. 修改告警条件资源的for_each配置,同时调整资源名称、查询语句确保唯一性和正确性:
resource "newrelic_alert_policy" "foo" {
  name = "foo"
}

resource "newrelic_nrql_alert_condition" "foo" {
  for_each = local.server_disk_pairs

  policy_id   = newrelic_alert_policy.foo.id
  type        = "static"
  # 每个告警条件使用唯一名称,包含服务器和磁盘标识
  name        = "磁盘使用率告警 - ${each.value.server_name} ${each.value.disk}"
  description = "${each.value.server_name} ${each.value.disk} 磁盘使用率超过90%时触发告警"

  nrql {
    # 针对单个磁盘构建查询,避免原代码中数组代入的语法错误
    query = "SELECT average(host.disk.usedPercent) as 'Storage Usage' FROM Metric WHERE entity.name = '${each.value.server_name}' and host.device = '${each.value.disk}'"
  }

  critical {
    operator              = "above"
    threshold             = 90
    threshold_duration    = 600
    threshold_occurrences = "ALL"
  }
}

核心要点:

  • server_disk_pairs通过嵌套for表达式生成唯一键(如WebServer01-C:)的键值对集合,满足for_each对唯一标识符的要求;
  • 资源名称加入服务器和磁盘信息,避免同名资源冲突;
  • NRQL查询中使用单个磁盘值,解决原代码中直接代入数组导致的查询语法错误。

内容的提问来源于stack exchange,提问作者Confounder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:14:59