Azure VMSS自定义脚本扩展启动时未自动执行问题求助
问题分析与解决方案
你的核心问题是VMSS扩容时新实例未自动执行CustomScript扩展,根源在于VMSS的模型-实例升级策略和扩展配置的关联逻辑,以下是具体解决步骤:
1. 调整VMSS升级策略
VMSS采用「模型定义+实例部署」的架构,默认如果升级策略设为Manual,新扩容的实例会沿用旧的VM模型(未包含扩展的版本),不会自动加载新添加的扩展。你需要将VMSS的升级策略改为Automatic或Rolling:
在你的azurerm_linux_virtual_machine_scale_set资源中添加或修改升级策略配置:
resource "azurerm_linux_virtual_machine_scale_set" "vmss" { # 其他原有配置... upgrade_policy { mode = "Automatic" # 可选:"Rolling"(更适合生产环境,可控制升级批次) } }
修改后重新部署,新扩容的实例会自动使用包含CustomScript扩展的最新模型,脚本会在实例启动时自动执行。
2. 优化扩展配置
在扩展资源中添加自动升级小版本的配置,确保扩展能随VMSS模型自动同步到新实例:
resource "azurerm_virtual_machine_scale_set_extension" "customScriptExtension" { name = "my-cs-ext" virtual_machine_scale_set_id = azurerm_linux_virtual_machine_scale_set.vmss.id publisher = "Microsoft.Azure.Extensions" type = "CustomScript" type_handler_version = "2.0" auto_upgrade_minor_version = true # 新增:自动升级扩展小版本 settings = jsonencode({ "commandToExecute" = "sh init.sh" "fileUris" = ["storageurlToDownloadfrom/init.sh?sas_token"] # 注意:此处需确保下载的是init.sh而非foo.txt,否则脚本会因文件不存在执行失败 }) }
3. 修正脚本下载路径(关键细节)
你当前配置中fileUris指向foo.txt,但执行命令是sh init.sh,这会导致实例下载的文件和执行脚本不匹配,直接引发执行失败。请将fileUris改为指向init.sh的有效存储URL(带SAS令牌)。
4. 同步现有实例(可选)
如果现有VMSS实例还在使用旧模型,修改升级策略后可通过Azure CLI触发批量升级,让现有实例也应用扩展:
az vmss update-instances --resource-group <你的资源组名称> --name <你的VMSS名称> --instance-ids "*"
为什么VM和VMSS有差异?
单VM是独立实例,添加扩展后会直接应用到该机器;而VMSS是集群架构,所有实例基于统一的「VM模型」创建。手动升级策略下,模型更新不会自动同步到实例(包括新扩容实例),必须手动触发升级;而自动/滚动策略会让新实例直接使用最新模型,无需手动干预。
内容的提问来源于stack exchange,提问作者rimrotarorot
相关产品推荐
相关产品推荐

