如何编写支持不同名称规格VM、共用同一自定义镜像的ARM模板
ARM模板创建多台异配置同自定义镜像虚拟机的落地方案
你不需要依赖copyIndex生成流水号命名,只要把各VM的差异化配置抽成对象数组作为入参,copy循环遍历数组取值即可,公共的自定义镜像配置全局复用即可,完全可以满足生产环境按需命名、按需指定规格的要求。
核心模板代码示例
参数定义段
"parameters": { "customImageId": { "type": "string", "metadata": { "description": "所有VM共用的自定义镜像资源ID" } }, "adminUsername": { "type": "string", "metadata": { "description": "VM管理员账号" } }, "adminPassword": { "type": "securestring", "metadata": { "description": "VM管理员密码" } }, "vmConfigs": { "type": "array", "metadata": { "description": "各VM的差异化配置列表" } } }
VM资源定义段
网卡等关联资源也可以用相同的数组遍历逻辑批量创建,不需要单独写重复代码:
"resources": [ { "type": "Microsoft.Compute/virtualMachines", "apiVersion": "2023-03-01", "name": "[parameters('vmConfigs')[copyIndex()].vmName]", "location": "[resourceGroup().location]", "copy": { "name": "vmCopyLoop", "count": "[length(parameters('vmConfigs'))]" }, "properties": { "hardwareProfile": { "vmSize": "[parameters('vmConfigs')[copyIndex()].vmSize]" }, "storageProfile": { "imageReference": { "id": "[parameters('customImageId')]" }, "osDisk": { "createOption": "FromImage", "managedDisk": { "storageAccountType": "Premium_LRS" } }, "copy": [ { "name": "dataDisks", "count": "[if(contains(parameters('vmConfigs')[copyIndex()], 'dataDiskCount'), parameters('vmConfigs')[copyIndex()].dataDiskCount, 0)]", "input": { "lun": "[copyIndex('dataDisks')]", "createOption": "Empty", "diskSizeGB": "[parameters('vmConfigs')[copyIndex()].dataDiskSizeGB]", "managedDisk": { "storageAccountType": "Premium_LRS" } } } ] }, "osProfile": { "computerName": "[parameters('vmConfigs')[copyIndex()].vmName]", "adminUsername": "[parameters('adminUsername')]", "adminPassword": "[parameters('adminPassword')]" }, "networkProfile": { "networkInterfaces": [ { "id": "[resourceId('Microsoft.Network/networkInterfaces', parameters('vmConfigs')[copyIndex()].nicName)]" } ] } }, "dependsOn": [ "[resourceId('Microsoft.Network/networkInterfaces', parameters('vmConfigs')[copyIndex()].nicName)]" ] } ]
参数文件配置示例
你可以在参数文件里按业务需求定义每台VM的配置,完全自定义命名和规格:
"parameters": { "customImageId": { "value": "/subscriptions/你的订阅ID/resourceGroups/镜像资源组/providers/Microsoft.Compute/images/你的自定义镜像名称" }, "adminUsername": { "value": "azureuser" }, "adminPassword": { "value": "你的安全密码" }, "vmConfigs": { "value": [ { "vmName": "biz-web-prod-01", "vmSize": "Standard_D2s_v5", "nicName": "nic-web-prod-01", "dataDiskCount": 1, "dataDiskSizeGB": 100 }, { "vmName": "biz-redis-prod-01", "vmSize": "Standard_D4s_v5", "nicName": "nic-redis-prod-01", "dataDiskCount": 2, "dataDiskSizeGB": 200 }, { "vmName": "biz-db-prod-01", "vmSize": "Standard_E8s_v5", "nicName": "nic-db-prod-01", "dataDiskCount": 4, "dataDiskSizeGB": 500 } ] } }
注意事项
- 如果部分VM需要独立配置(比如公网IP、特定NSG、不同的磁盘类型),直接在
vmConfigs的对应对象中新增字段,模板中通过if()、contains()函数做判断赋值即可,不会影响其他VM的配置 - 自定义镜像需要和VM部署在同一Azure区域,或属于你有权限访问的共享镜像库实例
- 如需批量配置扩展、备份策略、监控告警等公共规则,可新增对应资源的copy循环,遍历同一个
vmConfigs数组关联即可,无需重复定义配置
内容的提问来源于stack exchange,提问作者Anonymouus
相关产品推荐
相关产品推荐

