如何通过Azure DevOps CI/CD流水线部署PHP应用至Azure VMSS?求方案评估
方案评估与优化建议
一、你设想的CLI脚本自动化方案完全可行
可以通过Azure DevOps的CD流水线串联以下步骤实现全流程自动化:
- 部署应用到预演VM:使用Azure DevOps的
SSH任务或Azure CLI任务,将构建好的PHP应用包(如ZIP、tar.gz)传输到预演VM,执行解压、配置环境变量、重启PHP服务等操作。示例CLI命令:# 传输应用包到预演VM并部署 az vm run-command invoke --resource-group <你的资源组名> --name <预演VM名称> --command-id RunShellScript --scripts "wget <Azure存储账户中的应用包URL> -O /var/www/html/app.tar.gz && tar -xzf /var/www/html/app.tar.gz -C /var/www/html/ && systemctl restart php-fpm nginx" - 生成预演VM的自定义镜像:在预演环境验证通过后,用Azure CLI创建VM磁盘快照,再基于快照生成自定义镜像。示例命令:
# 创建VM OS磁盘快照 az snapshot create --resource-group <资源组名> --name <快照名称> --source <预演VM的OS磁盘ID> # 基于快照创建自定义镜像 az image create --resource-group <资源组名> --name <新版本镜像名称> --os-type Linux --source <快照ID> - 更新VMSS使用新版本镜像:调用CLI命令更新VMSS的镜像引用,并触发滚动更新。示例命令:
注意:可在流水线中添加健康验证任务(如发送HTTP请求检查预演VM的应用状态),只有验证通过后才进入生成镜像和更新VMSS的步骤。# 更新VMSS的镜像配置 az vmss update --resource-group <资源组名> --name <VMSS名称> --set virtualMachineProfile.storageProfile.imageReference.id=<新版本镜像ID> # 触发VMSS滚动更新 az vmss rolling-upgrade start --resource-group <资源组名> --name <VMSS名称>
二、更优的替代方案:直接部署应用到VMSS实例(无需镜像更新)
如果你的PHP应用不需要修改操作系统层面配置(如安装新系统依赖、更改内核参数),可以跳过镜像生成步骤,直接将应用部署到VMSS所有实例,效率提升明显:
- 使用Azure DevOps原生任务:用
Virtual Machine Scale Set Deployment任务,支持直接将应用包部署到VMSS实例,内置滚动部署、蓝绿部署等策略,无需手动编写复杂脚本。 - 配合自定义脚本扩展:在VMSS的实例模板中配置Azure自定义脚本扩展,流水线只需将应用包上传到存储账户,触发扩展执行拉取包、部署应用、重启服务的操作。示例扩展配置片段:
"extensionProfile": { "extensions": [ { "name": "deploy-php-app", "properties": { "publisher": "Microsoft.Azure.Extensions", "type": "CustomScript", "typeHandlerVersion": "2.1", "autoUpgradeMinorVersion": true, "settings": { "fileUris": ["<应用包存储URL>"], "commandToExecute": "tar -xzf app.tar.gz -C /var/www/html/ && systemctl restart php-fpm nginx" } } } ] } - 核心优势:部署速度更快(无需等待镜像创建和VMSS实例重建),回滚更便捷(只需重新部署旧版本应用包),运维成本更低。
三、混合方案(兼顾预演验证与高效部署)
如果必须保留预演环境的验证环节,同时想避免镜像更新的低效,可以采用:
- 先将应用部署到预演VM完成功能验证;
- 验证通过后,直接用相同的部署脚本/任务将应用推送到VMSS所有实例,跳过镜像生成步骤。
内容的提问来源于stack exchange,提问作者Anirudh Mounasamy
相关产品推荐
相关产品推荐

