如何在Azure VMSS虚拟机解除预配、关机或删除时执行自定义脚本
Azure VMSS缩容前执行自定义脚本的实现方案
首先确认你的观察符合VMSS的实际行为:手动/自动缩容时VMSS会直接强制释放实例,不会触发OS内正常关机流程,也不会等待系统计划任务执行完成。以下是适配你场景的可行方案:
方案1:通过VMSS批量Run Command执行脚本(适配无公网IP实例,优先推荐)
- Run Command原生支持针对VMSS内的单个或批量实例执行脚本,流量走Azure平台管理通道,不需要实例配置公网IP,也不需要额外开放端口权限
- 你可以直接在DevOps Pipeline的缩容步骤前新增执行节点,调用Azure CLI或PowerShell命令,指定待缩容的实例ID列表,批量执行目标脚本,确认所有脚本执行成功后再触发缩容操作
- 参考执行命令(Linux实例):
az vmss run-command invoke -g <资源组名称> -n <VMSS名称> --command-id RunShellScript --instance-ids <实例ID列表> --scripts "@<本地脚本文件路径>" - 若为Windows实例,将上述命令中的
RunShellScript替换为RunPowerShellScript即可
方案2:开启VMSS终止通知(适配后续自动缩容扩展场景)
- 你可以为VMSS开启终止通知功能,自定义配置最长15分钟的终止等待周期
- 触发缩容后,Azure会先向实例发送终止通知,进入等待周期,此时你可以提前在VM内配置定时轮询Azure元数据服务的任务,检测到终止通知后自动执行自定义脚本,等待周期结束后Azure才会正式删除实例
- 该方案无需修改DevOps Pipeline逻辑,后续如果切换为自动缩容模式也可以直接复用
流程建议
你当前为全手动控制缩容流程,优先选择方案1即可,所有逻辑统一在DevOps Pipeline中维护,不需要额外修改VM内部配置,运维成本更低。执行脚本时建议配置超时判断,避免异常脚本卡住整个缩容流程。
内容的提问来源于stack exchange,提问作者joelforsyth
相关产品推荐
相关产品推荐

