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

如何编写支持不同名称规格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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:54:04