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

如何在Azure DevOps中通过自动化用同一ARM模板创建多台Azure VM?

用ARM模板在Azure DevOps自动化批量创建虚拟机

1. 调整ARM模板支持批量创建

要实现批量生成同配置、不同名称的VM,核心是在ARM模板中使用copy循环重复创建虚拟机资源,同时通过参数控制数量和命名规则。

关键模板配置示例

  • 参数定义:添加控制VM数量、名称前缀的通用参数
"parameters": {
  "vmCount": {
    "type": "int",
    "defaultValue": 10,
    "metadata": {
      "description": "要创建的虚拟机数量"
    }
  },
  "vmNamePrefix": {
    "type": "string",
    "defaultValue": "myBatchVM",
    "metadata": {
      "description": "虚拟机名称前缀"
    }
  },
  "vmSize": {
    "type": "string",
    "defaultValue": "Standard_D2s_v3"
  },
  "adminUsername": {
    "type": "string"
  },
  "adminPassword": {
    "type": "securestring"
  },
  "virtualNetworkId": {
    "type": "string"
  }
}
  • 资源循环配置:针对Microsoft.Compute/virtualMachines资源添加copy规则,自动生成带索引的VM名称
"resources": [
  {
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2023-07-01",
    "name": "[concat(parameters('vmNamePrefix'), '-', copyIndex(1))]", // 生成myBatchVM-1、myBatchVM-2...
    "location": "[resourceGroup().location]",
    "copy": {
      "name": "vmCopy",
      "count": "[parameters('vmCount')]"
    },
    "properties": {
      "hardwareProfile": {
        "vmSize": "[parameters('vmSize')]"
      },
      "osProfile": {
        "computerName": "[concat(parameters('vmNamePrefix'), '-', copyIndex(1))]",
        "adminUsername": "[parameters('adminUsername')]",
        "adminPassword": "[parameters('adminPassword')]"
      },
      "storageProfile": {
        "imageReference": {
          "publisher": "MicrosoftWindowsServer",
          "offer": "WindowsServer",
          "sku": "2022-Datacenter",
          "version": "latest"
        },
        "osDisk": {
          "name": "[concat(concat(parameters('vmNamePrefix'), '-', copyIndex(1)), '-osdisk')]",
          "caching": "ReadWrite",
          "createOption": "FromImage"
        }
      },
      "networkProfile": {
        "networkInterfaces": [
          {
            "id": "[resourceId('Microsoft.Network/networkInterfaces', concat(parameters('vmNamePrefix'), '-nic-', copyIndex(1)))]"
          }
        ]
      }
    },
    "dependsOn": [
      "[concat('Microsoft.Network/networkInterfaces/', concat(parameters('vmNamePrefix'), '-nic-', copyIndex(1)))]"
    ]
  },
  // 批量创建配套网络接口(每个VM对应独立NIC)
  {
    "type": "Microsoft.Network/networkInterfaces",
    "apiVersion": "2023-09-01",
    "name": "[concat(parameters('vmNamePrefix'), '-nic-', copyIndex(1))]",
    "location": "[resourceGroup().location]",
    "copy": {
      "name": "nicCopy",
      "count": "[parameters('vmCount')]"
    },
    "properties": {
      "ipConfigurations": [
        {
          "name": "ipconfig1",
          "properties": {
            "subnet": {
              "id": "[concat(parameters('virtualNetworkId'), '/subnets/default')]"
            },
            "privateIPAllocationMethod": "Dynamic"
          }
        ]
      }
    }
  }
]

2. 在Azure DevOps中配置自动化流水线

步骤1:准备模板文件

将上述ARM模板保存为azuredeploy.json,上传到ADO的Git仓库中。

步骤2:创建Azure服务连接

在ADO项目的项目设置 > 服务连接中,添加Azure Resource Manager类型的服务连接,关联目标Azure订阅和资源组,用于流水线访问Azure资源。

步骤3:编写YAML流水线配置

新建流水线并选择仓库,编写YAML配置调用ARM模板部署任务:

trigger:
- main # 触发流水线的分支

pool:
  vmImage: 'ubuntu-latest'

steps:
- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    deploymentScope: 'Resource Group'
    azureResourceManagerConnection: '你的服务连接名称' # 替换为实际服务连接名
    action: 'Create Or Update Resource Group'
    resourceGroupName: '目标资源组名称' # 替换为实际资源组名
    location: 'eastus' # 替换为目标Azure区域
    templateLocation: 'Linked artifact'
    csmFile: 'azuredeploy.json' # 模板文件路径
    overrideParameters: '-vmCount 10 -vmNamePrefix "myProdVM" -adminUsername "adminuser" -virtualNetworkId "/subscriptions/你的订阅ID/resourceGroups/资源组名/providers/Microsoft.Network/virtualNetworks/你的VNet名"'
    deploymentMode: 'Incremental'
    deploymentName: 'VMDeployment-$(Build.BuildId)'

步骤4:运行并验证

提交YAML文件到仓库触发流水线,执行完成后登录Azure门户,检查目标资源组中是否生成了10台名称带索引的虚拟机。

注意事项

  • 若使用Linux VM,可替换osProfile为linuxConfiguration,用SSH公钥替代密码参数。
  • 敏感参数(如管理员密码)可通过ADO变量组管理,避免明文暴露。
  • 若需共享现有网络资源(如NSG、NAT网关),直接在模板中引用对应资源ID即可,无需批量创建。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:25:19