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

如何通过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安装命令需要对应调整。

额外优化建议

  1. 全参数化模板:把所有可变值(VM名称、磁盘名称、大小、VM规格等)都放到parameters里,大幅提高模板复用性。
  2. 条件部署合并模板:可以把三个阶段合并成一个模板,用condition参数控制是否创建VM、是否保留数据盘,实现更灵活的一键切换。
  3. 数据盘快照备份:在删除VM前,建议给数据盘创建快照,防止意外操作导致数据丢失。
  4. Windows环境适配:如果使用Windows VM,自定义脚本需要换成PowerShell命令,比如初始化磁盘、格式化、挂载,再安装MongoDB并修改配置文件中的dbPath。

内容的提问来源于stack exchange,提问作者Galet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:25:01