能否通过Azure DevOps构建部署Ubuntu虚拟机?相关配置问题求助
核心疑问解答
可以通过Packer构建Ubuntu镜像后自动发布为虚拟机,你当前的故障根源主要来自构建阶段的制品输出逻辑错误,以及Release阶段的制品拉取、部署逻辑缺失,和ARM模板没有必然关联,可按照以下步骤排查调整:
现有构建YAML的可优化点
你当前的配置存在两处冗余+一处关键缺失:
- 冗余配置1:同时用了
PublishBuildArtifacts@1和PublishPipelineArtifact@1两个制品发布任务,前者是旧版任务,新版Azure DevOps建议统一用PublishPipelineArtifact@1即可,多个重复发布任务容易导致Release阶段拉取制品时路径混淆 - 冗余配置2:
PublishPipelineArtifact@1的targetPath指向了整个$(Pipeline.Workspace),会把不必要的临时文件都打包,增加拉取耗时 - 关键缺失:Packer构建完成后会输出镜像资源ID,你当前没有把这个核心参数输出保存到制品里,Release阶段根本找不到你构建好的镜像,这是最常见的制品相关报错原因
你可以在PackerBuild@1任务之后加一个Bash任务,把Packer输出的镜像ID写入到参数文件里,再随制品发布,调整后的完整构建步骤参考:
trigger: batch: true name: $(BuildID) variables: - group: azure-packer-vars - group: azure-packer-secrets stages: - stage: ubuntu_18_04_lts displayName: Ubuntu Server 18.04 LTS jobs: - job: build displayName: Build Image timeoutInMinutes: 0 pool: vmImage: ubuntu-18.04 steps: - task: riezebosch.Packer.PackerTool.PackerTool@0 displayName: 'Use Packer 1.5.6' inputs: version: 1.5.6 - task: PackerBuild@1 displayName: 'Build Image' name: packerBuild # 新增任务名,用于调用输出变量 inputs: imageUri: 'BuildImage' templateType: 'custom' customTemplateLocation: 'packer.json' customTemplateParameters: '{"ClientAppId":"$(ClientAppId)", "ClientAppSecret":"$(ClientAppSecret)", "TenantId":"$(TenantId)", "SubscriptionId":"$(SubscriptionId)", "ImageDestRG":"$(ImageDestRG)", "TempResourceGroup":"$(TempResourceGroup)", "VirtualNetwork":"$(VirtualNetwork)", "VirtualNetworkRG":"$(VirtualNetworkRG)", "VirtualSubnet":"$(VirtualSubnet)", "Location":"$(Location)", "VMSize":"$(VMSize)", "StorageName":"$(StorageName)", "StorageKey":"$(StorageKey)", "StorageInstallerPath":"$(StorageInstallerPath)", "Build_BuildNumber":"$(Build.BuildNumber)", "Build_DefinitionName":"$(Build.DefinitionName)"}' # 新增任务:保存镜像ID到参数文件 - bash: | echo "IMAGE_ID=$(packerBuild.BuildImage)" > $(Build.ArtifactStagingDirectory)/image.env displayName: 保存镜像ID到参数文件 # 替换原有两个发布任务,只保留单个制品发布 - task: PublishPipelineArtifact@1 inputs: targetPath: '$(Build.ArtifactStagingDirectory)' artifact: 'buildOutput' publishLocation: 'pipeline'
Release阶段配置要点
你不需要提前接触ARM模板,直接用Azure DevOps内置的Azure CLI任务就能完成VM从镜像的发布,配置逻辑如下:
- 首先在Release流水线的「制品」页签,选择你当前的构建流水线作为制品源,开启「持续部署触发器」,这样构建完成后会自动触发部署
- 部署阶段的Agent选择
ubuntu-latest即可,添加两个任务:- 第一步:
DownloadPipelineArtifact@2,拉取构建阶段发布的buildOutput制品,拉取路径设置为$(Pipeline.Workspace)/artifacts - 第二步:
AzureCLI@2,先读取之前保存的镜像ID参数,再执行Azure CLI命令创建VM,示例命令如下:
# 加载镜像ID参数 source $(Pipeline.Workspace)/artifacts/image.env # 创建VM,按需替换占位的参数值 az vm create \ --resource-group 你的目标VM资源组名 \ --name 你的VM名称前缀-$(Build.BuildId) \ --image $IMAGE_ID \ --admin-username azureuser \ --ssh-key-values 你的SSH公钥内容 \ --size 你需要的VM规格 - 第一步:
- 注意要给你的Azure DevOps服务连接分配对应目标资源组的「虚拟机贡献者」权限,否则会报权限不足错误
内容的提问来源于stack exchange,提问作者SiLeNCeD
相关产品推荐
相关产品推荐

