Terraform插值失效求助:Azure多环境资源部署报错排查
问题分析与修正方案
核心错误原因
- 资源组名称拼接逻辑错误:
var.resource_group_name是列表类型,直接在字符串模板中引用会导致类型不匹配——each.value已经是列表中的单个元素(如Test-dev),无需再拼接整个列表。 - 未声明
var.env变量:代码中引用了var.env但未在variable.tf中定义,且错误提示其为map类型,无法直接与字符串拼接。 - 存储账户属性赋值颠倒:
resource_group_name应指向资源组的名称,location应指向资源组的位置,原代码两者赋值完全颠倒。
修正后的代码
variable.tf
variable "environments" { description = "各环境的配置信息" type = list(object({ name = string location = string })) default = [ { name = "Test-dev", location = "East Asia" }, { name = "Test-uat", location = "East Asia" }, { name = "Test-prod", location = "East Asia" } ] } variable "storage_account_prefix" { description = "存储账户名称前缀(Azure要求名称全小写、无特殊字符)" default = "teststorageact" }
main.tf
# 批量创建资源组 resource "azurerm_resource_group" "resgrp" { for_each = { for env in var.environments : env.name => env } name = "${each.value.name}-rg" location = each.value.location tags = { Environment = each.value.name } } # 批量创建存储账户 resource "azurerm_storage_account" "storageact" { for_each = { for env in var.environments : env.name => env } name = "${var.storage_account_prefix}${each.value.name}" resource_group_name = azurerm_resource_group.resgrp[each.key].name location = azurerm_resource_group.resgrp[each.key].location account_tier = "Standard" account_replication_type = "LRS" tags = { Environment = each.value.name } }
扩展:添加SQL数据库与密钥Vault
按照相同的for_each模式,可快速添加需求中的SQL Database和Key Vault资源:
# 批量创建密钥Vault resource "azurerm_key_vault" "kv" { for_each = { for env in var.environments : env.name => env } name = "kv-${each.value.name}" location = azurerm_resource_group.resgrp[each.key].location resource_group_name = azurerm_resource_group.resgrp[each.key].name tenant_id = data.azurerm_client_config.current.tenant_id soft_delete_retention_days = 7 sku_name = "standard" tags = { Environment = each.value.name } } # 批量创建SQL服务器与数据库 resource "azurerm_mssql_server" "sql_server" { for_each = { for env in var.environments : env.name => env } name = "sql-${each.value.name}" resource_group_name = azurerm_resource_group.resgrp[each.key].name location = azurerm_resource_group.resgrp[each.key].location version = "12.0" administrator_login = "sqladmin" administrator_login_password = "yourStrongPassword123!" # 建议从密钥Vault或安全变量传入 tags = { Environment = each.value.name } } resource "azurerm_mssql_database" "sql_db" { for_each = { for env in var.environments : env.name => env } name = "sqldb-${each.value.name}" server_id = azurerm_mssql_server.sql_server[each.key].id sku_name = "GP_Gen5_2" tags = { Environment = each.value.name } }
内容的提问来源于stack exchange,提问作者Wonder wolf
相关产品推荐
相关产品推荐

