Terraform模块中azurerm_dns_txt_record的record块重构优化问题
问题根因
你当前的问题核心是两点:
- 原有dynamic块写法逻辑本身没有语法错误,出现记录覆盖是因为你传入的
TxtRecords参数没有做去重,或者你混淆了TXT记录与MX记录的资源定义(你描述中提到生成了MX记录,但给出的代码全是TXT记录的配置,属于逻辑错位) - 单个
azurerm_dns_txt_record资源对应同一主机名(如你配置的@)下的所有TXT值集合,如果你需要每个值对应独立的DNS记录,需要把记录值展开为独立的资源实例。
优化方案
方案1:单资源多record块(同一主机名下所有TXT值放在同一个资源里,和你最初硬编码的效果一致)
首先优化冗余的local定义,去掉无用的flatten,给记录值做去重处理:
locals { txt_records = [ for i in var.DnsZones : { zone_name = i.ZoneName resource_group_name = i.ResourceGroup name = "@" ttl = i.Ttl records = toset(i.TxtRecords) # 转set去重,避免重复值导致的覆盖 } ] } resource "azurerm_dns_zone" "zone" { count = length(var.DnsZones) name = var.DnsZones[count.index].ZoneName resource_group_name = var.DnsZones[count.index].ResourceGroup } resource "azurerm_dns_txt_record" "record-txt" { count = length(local.txt_records) resource_group_name = local.txt_records[count.index].resource_group_name zone_name = local.txt_records[count.index].zone_name ttl = local.txt_records[count.index].ttl name = local.txt_records[count.index].name dynamic "record" { for_each = local.txt_records[count.index].records content { value = record.value } } depends_on = [azurerm_dns_zone.zone] }
执行terraform plan即可看到每个资源下的record块数量和你传入的TxtRecords长度一致,不会出现覆盖。
方案2:每个TXT值对应独立资源
如果你需要每个TXT值对应独立的DNS记录(支持不同主机名),则需要把记录值展开到local的外层,用for_each管理资源实例:
locals { txt_records = flatten([ for zone_idx, zone in var.DnsZones : [ for record_idx, txt_val in zone.TxtRecords : { zone_name = zone.ZoneName resource_group_name = zone.ResourceGroup name = "@" # 如需不同主机名可在此修改 ttl = zone.Ttl record_value = txt_val unique_key = "${zone_idx}-${record_idx}" # 全局唯一标识避免资源冲突 } ] ]) } resource "azurerm_dns_zone" "zone" { count = length(var.DnsZones) name = var.DnsZones[count.index].ZoneName resource_group_name = var.DnsZones[count.index].ResourceGroup } resource "azurerm_dns_txt_record" "record-txt" { for_each = { for r in local.txt_records : r.unique_key => r } resource_group_name = each.value.resource_group_name zone_name = each.value.zone_name ttl = each.value.ttl name = each.value.name record { value = each.value.record_value } depends_on = [azurerm_dns_zone.zone] }
MX记录适配
如果你实际需要创建的是MX记录,只需要将资源类型替换为azurerm_dns_mx_record,调整record块的字段即可,逻辑和上述TXT记录完全一致:
# MX记录示例 dynamic "record" { for_each = local.mx_records content { preference = record.value.priority exchange = record.value.domain } }
内容的提问来源于stack exchange,提问作者ossentoo
相关产品推荐
相关产品推荐

