如何在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
相关产品推荐
相关产品推荐

