如何在Terraform中用for_each循环为服务器与磁盘组合创建资源
解决方案
要实现服务器与磁盘的组合遍历,需要先将嵌套的服务器-磁盘结构扁平化,生成包含4个独立组合的集合,再以此作为for_each的数据源。具体操作如下:
- 新增扁平化本地变量,拆分每个服务器的磁盘组合:
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 } } ]...) }
- 修改告警条件资源的
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
相关产品推荐
相关产品推荐

