Terraform如何访问map类型变量元素?访问common_firewall_rules报无效索引错误
错误原因
- 你定义的
common_firewall_rules是map(键值对映射)类型,而非列表类型,不能使用[0]、[1]这类数字下标访问元素,需要通过你声明的键名(IP_Orange、OBS1、OBS2)取值。 - 代码中多余的
.value后缀不需要,map内的属性可以直接访问。
解决方法
方案1:半硬编码写3条规则
按键名访问对应规则值即可,写法如下:
# Orange规则 ipv4_firewall_rule { name = var.common_firewall_rules["IP_Orange"].name range_start = var.common_firewall_rules["IP_Orange"].start_ip_address range_end = var.common_firewall_rules["IP_Orange"].end_ip_address } # OBS1规则 ipv4_firewall_rule { name = var.common_firewall_rules["OBS1"].name range_start = var.common_firewall_rules["OBS1"].start_ip_address range_end = var.common_firewall_rules["OBS1"].end_ip_address } # OBS2规则 ipv4_firewall_rule { name = var.common_firewall_rules["OBS2"].name range_start = var.common_firewall_rules["OBS2"].start_ip_address range_end = var.common_firewall_rules["OBS2"].end_ip_address }
方案2:动态块自动生成所有规则(更推荐)
不用硬编码每条规则,后续新增规则只需要修改tfvars文件即可,无需调整资源块代码:
resource "azurerm_analysis_services_server" "as" { # 其他原有配置保持不变 dynamic "ipv4_firewall_rule" { for_each = var.common_firewall_rules content { name = ipv4_firewall_rule.value.name range_start = ipv4_firewall_rule.value.start_ip_address range_end = ipv4_firewall_rule.value.end_ip_address } } }
注意事项
你当前tfvars中OBS1对应的name属性值写为了OBS2,属于笔误,会导致两条规则名重复,建议提前修正。
内容的提问来源于stack exchange,提问作者Harry Leboeuf
相关产品推荐
相关产品推荐

