如何通过ARM template实现Azure VM删留MongoDB Data disk并复用?
使用ARM模板实现Azure VM与MongoDB数据盘的生命周期解耦(复用数据盘)
刚好做过类似的场景,核心思路是把数据磁盘和虚拟机的生命周期彻底分开——让数据盘成为独立的Azure顶级资源,而非VM的附属嵌套资源。这样就能轻松实现删除VM时保留数据盘,后续新VM直接挂载复用的需求。下面分三个阶段一步步拆解实现方式:
一、第一阶段:创建独立数据盘 + 带MongoDB的VM(挂载并配置数据盘)
这个阶段的ARM模板会同时完成两件事:创建独立的托管数据盘,以及创建VM并挂载该磁盘,最后通过自定义脚本扩展安装MongoDB并将其数据目录指向数据盘。
核心模板代码片段
1. 定义独立数据磁盘资源
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "dataDiskName": { "type": "string", "defaultValue": "mongodb-data-disk" }, "dataDiskSizeGB": { "type": "int", "defaultValue": 64 }, "vmName": { "type": "string", "defaultValue": "mongodb-vm-01" }, "vmSize": { "type": "string", "defaultValue": "Standard_D2s_v3" }, // 其他参数:虚拟网络、OS镜像等,此处省略 }, "resources": [ // 独立数据磁盘(关键:顶级资源,不嵌套在VM里) { "type": "Microsoft.Compute/disks", "apiVersion": "2023-09-01", "name": "[parameters('dataDiskName')]", "location": "[resourceGroup().location]", "sku": { "name": "Standard_LRS" }, // 可按需替换为Premium_LRS "properties": { "creationData": { "createOption": "Empty" }, "diskSizeGB": "[parameters('dataDiskSizeGB')]" } }, // 虚拟机资源 { "type": "Microsoft.Compute/virtualMachines", "apiVersion": "2023-09-01", "name": "[parameters('vmName')]", "location": "[resourceGroup().location]", "dependsOn": [ "[resourceId('Microsoft.Compute/disks', parameters('dataDiskName'))]" // 其他依赖:虚拟网络、网卡等,此处省略 ], "properties": { "hardwareProfile": { "vmSize": "[parameters('vmSize')]" }, "storageProfile": { "osDisk": { // OS磁盘配置,此处省略 }, "dataDisks": [ { "lun": 0, "name": "[parameters('dataDiskName')]", "createOption": "Attach", "managedDisk": { "id": "[resourceId('Microsoft.Compute/disks', parameters('dataDiskName'))]" } } ] }, // 网络配置、OS配置等,此处省略 "resources": [ // 自定义脚本扩展:格式化磁盘、安装MongoDB、配置数据目录 { "type": "extensions", "apiVersion": "2023-09-01", "name": "Install-MongoDB", "location": "[resourceGroup().location]", "dependsOn": [ "[resourceId('Microsoft.Compute/virtualMachines', parameters('vmName'))]" ], "properties": { "publisher": "Microsoft.Azure.Extensions", "type": "CustomScript", "typeHandlerVersion": "2.1", "autoUpgradeMinorVersion": true, "settings": { "commandToExecute": "[concat( 'sudo mkfs.ext4 /dev/sdc; ', // Ubuntu系统下LUN0对应/dev/sdc,注意不要搞错路径 'sudo mkdir -p /mnt/mongodb-data; ', 'sudo mount /dev/sdc /mnt/mongodb-data; ', 'sudo echo \"/dev/sdc /mnt/mongodb-data ext4 defaults 0 0\" >> /etc/fstab; ', // 安装MongoDB(以Ubuntu 22.04为例) 'wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo apt-key add -; ', 'echo \"deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse\" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list; ', 'sudo apt-get update; ', 'sudo apt-get install -y mongodb-org; ', // 修改MongoDB配置,指向数据盘目录 'sudo sed -i \"s|dbPath: /var/lib/mongodb|dbPath: /mnt/mongodb-data|\" /etc/mongod.conf; ', 'sudo systemctl restart mongod; ', 'sudo systemctl enable mongod' )]" } } } ] } } ] }
关键注意点
- 数据磁盘是顶级独立资源,不是VM的嵌套资源,这是实现“删VM不删盘”的核心!如果把数据盘定义在VM的嵌套资源里,删除VM时会连带删除磁盘。
- 脚本中的磁盘路径要对应OS:Ubuntu系统LUN0通常是
/dev/sdc,Windows系统则是F:等,需根据实际OS调整。 - 一定要把挂载信息写入
fstab(Linux)或配置自动挂载(Windows),确保VM重启后磁盘能自动挂载。
二、第二阶段:删除VM但保留数据磁盘
可以用ARM模板的Complete部署模式来实现——只在模板中保留数据磁盘资源,部署后资源组里只会保留模板定义的资源,其他资源(VM、网卡等)会被自动删除。
示例删除模板
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "dataDiskName": { "type": "string", "defaultValue": "mongodb-data-disk" }, "dataDiskSizeGB": { "type": "int", "defaultValue": 64 } }, "resources": [ // 只保留数据磁盘资源 { "type": "Microsoft.Compute/disks", "apiVersion": "2023-09-01", "name": "[parameters('dataDiskName')]", "location": "[resourceGroup().location]", "sku": { "name": "Standard_LRS" }, "properties": { "creationData": { "createOption": "Empty" }, "diskSizeGB": "[parameters('dataDiskSizeGB')]" } } ] }
⚠️ 部署时务必指定
mode: Complete,且确认资源组内只有VM和数据盘相关资源,避免误删其他重要资源!
三、第三阶段:创建新VM并复用已有数据磁盘
这个阶段的模板和第一阶段类似,但不需要重新创建数据盘,直接挂载已有的磁盘即可,同时再次运行自定义脚本配置MongoDB(新VM没有之前的配置)。
核心模板代码片段
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "dataDiskName": { "type": "string", "defaultValue": "mongodb-data-disk" }, "newVmName": { "type": "string", "defaultValue": "mongodb-vm-02" }, "vmSize": { "type": "string", "defaultValue": "Standard_D2s_v3" } // 其他参数:虚拟网络等,此处省略 }, "resources": [ // 新虚拟机资源 { "type": "Microsoft.Compute/virtualMachines", "apiVersion": "2023-09-01", "name": "[parameters('newVmName')]", "location": "[resourceGroup().location]", "dependsOn": [ "[resourceId('Microsoft.Compute/disks', parameters('dataDiskName'))]" // 其他依赖:虚拟网络、网卡等,此处省略 ], "properties": { "storageProfile": { "dataDisks": [ { "lun": 0, "name": "[parameters('dataDiskName')]", "createOption": "Attach", "managedDisk": { "id": "[resourceId('Microsoft.Compute/disks', parameters('dataDiskName'))]" } } ] }, // 其他VM配置,此处省略 "resources": [ // 自定义脚本:挂载磁盘、安装MongoDB、配置数据目录(注意不要格式化磁盘!) { "type": "extensions", "apiVersion": "2023-09-01", "name": "Configure-MongoDB", "location": "[resourceGroup().location]", "dependsOn": [ "[resourceId('Microsoft.Compute/virtualMachines', parameters('newVmName'))]" ], "properties": { "publisher": "Microsoft.Azure.Extensions", "type": "CustomScript", "typeHandlerVersion": "2.1", "autoUpgradeMinorVersion": true, "settings": { "commandToExecute": "[concat( 'sudo mount /dev/sdc /mnt/mongodb-data; ', // 直接挂载,绝对不要格式化! 'sudo echo \"/dev/sdc /mnt/mongodb-data ext4 defaults 0 0\" >> /etc/fstab; ', // 安装MongoDB(和第一阶段一致) 'wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo apt-key add -; ', 'echo \"deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse\" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list; ', 'sudo apt-get update; ', 'sudo apt-get install -y mongodb-org; ', // 修改MongoDB配置,指向已有数据目录 'sudo sed -i \"s|dbPath: /var/lib/mongodb|dbPath: /mnt/mongodb-data|\" /etc/mongod.conf; ', 'sudo systemctl restart mongod; ', 'sudo systemctl enable mongod' )]" } } } ] } } ] }
关键注意点
- 绝对不要格式化已有数据盘!脚本中必须去掉
mkfs.ext4命令,否则会丢失所有MongoDB数据。 - 确保新VM的OS和之前的VM一致(比如都是Ubuntu 22.04),否则磁盘挂载路径和MongoDB安装命令需要对应调整。
额外优化建议
- 全参数化模板:把所有可变值(VM名称、磁盘名称、大小、VM规格等)都放到
parameters里,大幅提高模板复用性。 - 条件部署合并模板:可以把三个阶段合并成一个模板,用
condition参数控制是否创建VM、是否保留数据盘,实现更灵活的一键切换。 - 数据盘快照备份:在删除VM前,建议给数据盘创建快照,防止意外操作导致数据丢失。
- Windows环境适配:如果使用Windows VM,自定义脚本需要换成PowerShell命令,比如初始化磁盘、格式化、挂载,再安装MongoDB并修改配置文件中的
dbPath。
内容的提问来源于stack exchange,提问作者Galet
相关产品推荐
相关产品推荐

