Terraform 在没有原因的情况下想要重新部署 Azure 虚拟机

40次阅读
没有评论

问题描述

在使用 Terraform 定义 Azure 虚拟机时遇到一个问题。每次运行 terraform apply 命令时,Terraform 都会认为 admin_username 已经被修改,并希望重新部署虚拟机。用户希望找到解决方法,以便正确处理这个问题。

解决方案

请注意以下操作可能因版本差异而有所不同。

解决方案背景

问题出现的原因与 Terraform 的一些机制相关。当 Terraform 运行时,它会检查资源配置文件中的各个属性,以确定是否需要进行更改或重新部署。在这种情况下,Terraform 认为 admin_username 属性已更改,导致每次运行时都触发了重新部署操作。为了解决这个问题,我们需要通过适当的方法处理 admin_username 属性,以避免不必要的重新部署。

解决方案步骤

以下是解决这个问题的两种方法,你可以根据你的需求选择其中之一。

方法1:使用输出变量来避免重新部署

  1. 在你的 Terraform 配置文件中,输出 keyvault_id 变量。这可以通过在模块中使用 output 声明来实现。例如:
output "keyvault_id" {
  value = data.azurerm_key_vault.kv.id
}
  1. 在你的资源配置文件中,使用该输出变量来代替直接引用 data 块中的值。例如,替换原来的代码:
data "azurerm_key_vault_secret" "username" {
  name         = var.username
  key_vault_id = data.azurerm_key_vault.kv.id
}

为:

data "azurerm_key_vault_secret" "username" {
  name         = var.username
  key_vault_id = module.your_module_name.keyvault_id
}

这样做的好处是,你将 keyvault_id 的值从输出变量中引入,避免了直接引用 data 块中的值,从而避免了不必要的重新部署。

方法2:手动指定 admin_username 属性

如果你希望保持原有的代码结构,并且只是希望避免 admin_username 属性的重新部署,你可以手动指定 admin_username 属性,以告诉 Terraform 不对其进行检查。在你的资源配置文件中,为 admin_username 属性添加 lifecycle 块,并在其中设置 ignore_changes 参数。例如:

resource "azurerm_linux_virtual_machine" "vm" {
  # 其他属性配置

  admin_username = data.azurerm_key_vault_secret.username.value

  lifecycle {
    ignore_changes = [admin_username]
  }
}

这样,Terraform 将忽略对 admin_username 属性的更改,从而避免不必要的重新部署。

总结

通过使用输出变量或手动指定 ignore_changes,你可以有效地避免因为 admin_username 属性的改变而导致的不必要的重新部署问题。选择适合你情况的方法,可以帮助你更好地管理 Terraform 配置并提高工作效率。

请注意,本文中的代码示例和方法可能因 Terraform 版本变化而有所不同,建议在实际操作前查阅官方文档或手册,以确保操作正确。

正文完