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

如何通过Terraform实现Azure VMSS实例重新镜像以更新自定义数据?

解决方案:Terraform自动触发Azure VMSS实例重建(当自定义数据变更时)

方案一:利用VMSS滚动更新机制自动触发实例替换

如果你的VMSS已配置滚动更新模式,可通过调整配置让custom_data变更触发自动滚动更新,从而替换现有实例:

  1. 确保VMSS的upgrade_mode设置为Rolling,并启用自动升级策略:
resource "azurerm_virtual_machine_scale_set" "example" {
  name                = "example-vmss"
  resource_group_name = azurerm_resource_group.example.name
  location            = azurerm_resource_group.example.location
  sku                 = "Standard_D2s_v3"
  instances           = 3
  upgrade_mode        = "Rolling" # 滚动更新模式

  rolling_upgrade_policy {
    max_batch_instance_percent        = 20
    max_unhealthy_instance_percent    = 20
    max_unhealthy_upgraded_instance_percent = 20
    pause_time_between_batches        = "PT5M"
  }

  automatic_upgrade_policy {
    enable_automatic_upgrade = true # 启用自动升级,模型变更时自动触发滚动更新
    disable_automatic_rollback = false
  }

  os_profile {
    computer_name_prefix = "example"
    admin_username      = "adminuser"
    custom_data         = base64encode(file("${path.module}/custom-data.sh")) # 自定义数据
  }

  # 其他配置(网络、存储、镜像等)...
}

当custom_data变更时,Terraform会更新VMSS的模型,由于启用了enable_automatic_upgrade = true,Azure会自动启动滚动更新,逐步替换现有实例为应用新自定义数据的实例。

方案二:通过null_resource强制触发实例重建

如果滚动更新机制无法满足需求(比如需要一次性重建所有实例),可以用null_resource配合Azure CLI命令,在custom_data变更时强制重新镜像所有VMSS实例:

  1. 定义null_resource,将custom_data的哈希值作为触发条件:
resource "azurerm_virtual_machine_scale_set" "example" {
  # 现有VMSS配置...
  os_profile {
    custom_data = base64encode(file("${path.module}/custom-data.sh"))
  }
}

resource "null_resource" "reimage_vmss" {
  triggers = {
    # 当自定义数据内容变更时,触发该资源执行
    custom_data_hash = sha256(file("${path.module}/custom-data.sh"))
    vmss_id          = azurerm_virtual_machine_scale_set.example.id
  }

  provisioner "local-exec" {
    command = <<EOT
      az vmss reimage --ids ${azurerm_virtual_machine_scale_set.example.id} --instance-id '*'
    EOT
  }
}
  • triggers块中的custom_data_hash会在自定义数据文件内容变更时更新,触发null_resource重新执行。
  • az vmss reimage --instance-id '*'会重新镜像VMSS的所有实例,强制重建并应用新的自定义数据。

注意事项

  • 方案一中的滚动更新会逐步替换实例,不会导致所有实例同时下线,适合生产环境;方案二会一次性重建所有实例,可能造成服务中断,需谨慎使用。
  • 确保Terraform执行环境已安装并配置好Azure CLI,且拥有足够的权限操作VMSS实例。
  • 自定义数据必须是base64编码后的内容,Terraform的base64encode函数可自动处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 18:22:37