如何使用for_each为每个Azure虚拟机传递不同Key Vault密钥
为每个虚拟机分配独立Key Vault密钥的解决方案
核心思路
在虚拟机映射变量中添加每个实例对应的密钥标识,通过Terraform的Key Vault数据源批量获取不同密钥,再关联到对应虚拟机。
步骤1:更新虚拟机映射变量
修改var.vm_map,为每个虚拟机条目添加对应的Key Vault密钥名称:
variable "vm_map" { type = map(object({ name = string size = string secret_name = string # 新增:对应Key Vault中该VM的密钥名称 })) example = { vm-01 = { name = "win-vm-01" size = "Standard_D2s_v3" secret_name = "vm-01-admin-password" } vm-02 = { name = "win-vm-02" size = "Standard_D2s_v3" secret_name = "vm-02-admin-password" } } }
步骤2:添加Key Vault密钥数据源
通过azurerm_key_vault_secret数据源,配合for_each遍历vm_map,批量获取每个虚拟机对应的密钥值:
# 获取Key Vault的基础信息(需提前创建好Key Vault) data "azurerm_key_vault" "main" { name = "your-key-vault-name" # 替换为你的Key Vault名称 resource_group_name = var.m_resource_group_name } # 批量获取每个VM对应的密钥 data "azurerm_key_vault_secret" "vm_admin_pw" { for_each = var.vm_map name = each.value.secret_name key_vault_id = data.azurerm_key_vault.main.id }
步骤3:修改虚拟机资源引用独立密钥
将admin_password字段替换为对应数据源的密钥值,确保每个虚拟机调用自己的密钥:
resource "azurerm_windows_virtual_machine" "winservertest" { for_each = var.vm_map name = each.value.name resource_group_name = var.m_resource_group_name location = var.m_location size = each.value.size admin_username = var.m_admin_username # 引用对应VM的独立密钥 admin_password = data.azurerm_key_vault_secret.vm_admin_pw[each.key].value patch_mode = "Manual" enable_automatic_updates = false network_interface_ids = [ azurerm_network_interface.nic-multi-vms-01[each.key].id ] }
额外说明
- 如果不同虚拟机的密钥存储在不同Key Vault中,可在
vm_map中新增key_vault_name和key_vault_rg字段,修改数据源时引用这些值即可。 - 确保Terraform执行账号拥有Key Vault的
Secret Get权限,否则无法读取密钥。 - 密钥值会被Terraform标记为敏感数据,执行过程中不会明文输出。
内容的提问来源于stack exchange,提问作者wicker
相关产品推荐
相关产品推荐

