如何将Terraform中的两个网络规则对象合并为单个集合?
合并Terraform存储账户网络规则的实现方案
要将默认网络规则(local.default_network_rules)与可配置变量规则(var.network_rules)合并,最终用于创建azurerm_storage_account_network_rules资源,可按以下步骤实现:
1. 调整本地变量,添加合并逻辑
在locals.tf中新增合并后的规则计算逻辑,优先使用变量传入的非null值,同时追加IP规则和子网ID:
locals { default_network_rules = [ { default_action = "Deny" ip_rules = ["IP_string"] virtual_network_subnet_ids = [] } ] # 合并默认规则与变量规则 merged_network_rules = [ merge( local.default_network_rules[0], { # 优先使用变量中的default_action,否则保留默认值 default_action = var.network_rules[0].default_action != null ? var.network_rules[0].default_action : local.default_network_rules[0].default_action, # 合并默认IP规则与变量传入的IP规则(变量为null时追加空列表) ip_rules = concat( local.default_network_rules[0].ip_rules, var.network_rules[0].ip_rules != null ? var.network_rules[0].ip_rules : [] ), # 合并默认子网ID与变量传入的子网ID virtual_network_subnet_ids = concat( local.default_network_rules[0].virtual_network_subnet_ids, var.network_rules[0].virtual_network_subnet_ids != null ? var.network_rules[0].virtual_network_subnet_ids : [] ) } ) ] }
如果需要对IP规则或子网ID去重,可在concat外层包裹distinct函数:
ip_rules = distinct(concat( local.default_network_rules[0].ip_rules, var.network_rules[0].ip_rules != null ? var.network_rules[0].ip_rules : [] ))
2. 在存储账户网络规则资源中引用合并后的规则
创建azurerm_storage_account_network_rules资源时,直接使用合并后的规则值:
resource "azurerm_storage_account_network_rules" "example" { storage_account_id = azurerm_storage_account.example.id default_action = local.merged_network_rules[0].default_action ip_rules = local.merged_network_rules[0].ip_rules virtual_network_subnet_ids = local.merged_network_rules[0].virtual_network_subnet_ids }
逻辑说明
- 当用户未传入
var.network_rules(使用默认的null值)时,将直接使用local.default_network_rules的配置 - 当用户传入自定义规则时:
default_action会被变量中的值覆盖ip_rules和virtual_network_subnet_ids会将默认值与变量传入的值合并- 变量中为
null的属性将保留默认配置
内容的提问来源于stack exchange,提问作者Ben Lavender
相关产品推荐
相关产品推荐

