通过ARM模板基于含数据磁盘的现有Azure镜像创建VM时能否添加额外数据磁盘?
用带数据磁盘的Azure镜像创建VM时添加额外磁盘的解决方案
当然可以实现啦!你碰到的这个错误其实是ARM模板的JSON结构出了问题——JSON对象里不允许存在同名属性,而你的模板里storageProfile节点下重复定义了dataDisks,所以才会抛出 Can not add property dataDisks to Newtonsoft.Json.Linq.JObject. Property with the same name already exists on object 这个错误提示。
错误根源
当你使用包含数据磁盘的自定义镜像时,如果模板中既通过镜像引用继承了磁盘配置,又手动重复写了一个dataDisks节点,就会导致JSON解析时出现重复属性的冲突。
正确实现方法
要保留镜像原有数据磁盘并添加额外磁盘,你只需要确保storageProfile下只有一个dataDisks数组,并把镜像中原有的磁盘配置和新磁盘配置合并到这个数组里即可:
获取镜像原有数据磁盘配置
你可以在Azure门户或通过Azure CLI命令az image show --name <镜像名称> --resource-group <资源组名称>查看镜像的dataDisks配置,把这些配置复制到模板的dataDisks数组中。合并新磁盘配置
在同一个dataDisks数组里,追加你想要添加的额外磁盘配置。如果需要批量添加多个磁盘,还可以用ARM模板的copy功能来简化:示例模板片段:
"storageProfile": { "imageReference": { "id": "[resourceId('Microsoft.Compute/images', parameters('imageName'))]" }, "osDisk": { "caching": "ReadWrite", "createOption": "FromImage" }, "dataDisks": [ // 镜像中原有的数据磁盘配置 { "lun": 0, "createOption": "FromImage", "caching": "ReadOnly", "diskSizeGB": 128 } ], // 用copy循环批量添加额外磁盘 "copy": [ { "name": "dataDisks", "count": "[parameters('numberOfAdditionalDataDisks')]", "input": { "lun": "[add(1, copyIndex('dataDisks'))]", "createOption": "Empty", "diskSizeGB": "[parameters('additionalDataDiskSizeGB')]", "caching": "ReadWrite" } } ] }注意事项
- 每个数据磁盘的
lun(逻辑单元号)必须唯一,不能和原有磁盘的lun重复 - 新磁盘的
createOption设为Empty(创建空磁盘),原有磁盘的createOption保持FromImage(从镜像复制)
- 每个数据磁盘的
这样配置后,部署ARM模板时就会同时创建镜像里的原有数据磁盘和你新增的额外磁盘,不会再出现重复属性的错误啦。
内容的提问来源于stack exchange,提问作者KRM
相关产品推荐
相关产品推荐

