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

能否通过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从镜像的发布,配置逻辑如下:

  1. 首先在Release流水线的「制品」页签,选择你当前的构建流水线作为制品源,开启「持续部署触发器」,这样构建完成后会自动触发部署
  2. 部署阶段的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规格
    
  3. 注意要给你的Azure DevOps服务连接分配对应目标资源组的「虚拟机贡献者」权限,否则会报权限不足错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:06:03