You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改KeyVault密码后如何阻止Terraform重建虚拟机?

解决Terraform修改KeyVault密码后虚拟机被销毁重建的问题

问题核心

当更新KeyVault中过期的密码后,Terraform执行计划触发虚拟机销毁重建,本质原因是虚拟机的管理员密码字段属于Terraform的「强制替换属性」——一旦该字段值发生变化,Terraform无法直接更新现有VM,只能通过销毁重建来应用新密码。

解决方案

根据配置场景,提供两种可行方案,按优先级推荐:


方案1:改用KeyVault动态引用注入密码(推荐)

这种方式让VM从KeyVault动态拉取密码,Terraform不会将明文密码作为VM资源的属性存储,因此密码变更不会触发VM重建。

修改vm.tf中的os_profile配置:

resource "azurerm_windows_vm" "my_vm" {
  # 其他VM配置...

  os_profile {
    computer_name  = "my-vm"
    admin_username = "adminuser"
    # 替换直接密码引用为KeyVault动态引用
    admin_password = jsonencode({
      "reference": {
        "keyVault": {
          "id": azurerm_key_vault.my_kv.id
        },
        "secretName": azurerm_key_vault_secret.vm_password.name
      }
    })
  }

  # 配置系统身份用于访问KeyVault
  identity {
    type = "SystemAssigned"
  }
}

同时在keyvault.tf中添加访问策略,允许VM的系统身份读取Secret:

resource "azurerm_key_vault_access_policy" "vm_access" {
  key_vault_id = azurerm_key_vault.my_kv.id
  tenant_id    = data.azurerm_client_config.current.tenant_id

  object_id = azurerm_windows_vm.my_vm.identity[0].principal_id

  secret_permissions = [
    "Get",
  ]
}

方案2:通过Lifecycle忽略密码字段变更

如果无法使用动态引用,可以让Terraform忽略密码字段的变化,从而阻止VM重建。注意:这种方式下,密码变更不会自动同步到VM,需要手动通过Azure门户/CLI更新VM密码。

在vm.tf的VM资源块中添加lifecycle配置:

resource "azurerm_windows_vm" "my_vm" {
  # 其他VM配置...

  lifecycle {
    ignore_changes = [
      os_profile[0].admin_password, # 忽略密码字段的变更检测
    ]
    prevent_destroy = true # 可选,防止意外销毁VM
  }
}

额外检查点

  • 查看keyvault.tf中的Secret资源,确保没有指定固定version字段——如果绑定了特定版本,密码更新后版本变化也会触发依赖资源的变更,去掉version让Terraform自动使用最新版本即可。
  • 检查Terraform执行计划的销毁原因,确认是否是os_profile.0.admin_password字段标记为must be replaced,如果是,上述方案即可解决。

内容的提问来源于stack exchange,提问作者gotothesky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:37:20