使用 VM 托管磁盘模板

本文介绍使用 Azure 资源管理器模板在 Azure Stack Hub 中预配虚拟机(VM)时托管和非托管磁盘之间的差异。 这些示例可帮助你将使用非托管磁盘的现有模板转换为托管磁盘。

注释

非托管磁盘正在逐步停用。 在停用日期之前迁移到托管磁盘。 有关详细信息,请参阅 非托管磁盘弃用

非托管磁盘模板格式

在开始之前,我们先了解一下非托管磁盘的部署方式。 创建非托管磁盘时,你需要一个存储帐户来保存 VHD 文件。 可以创建新存储帐户,或使用现有的存储帐户。 在模板的资源块中创建新的存储帐户资源,如下所示:

{
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2017-10-01",
    "name": "[variables('storageAccountName')]",
    "location": "[resourceGroup().location]",
    "sku": {
        "name": "Standard_LRS"
    },
    "kind": "Storage"
}

在虚拟机对象中,添加对存储帐户的依赖项,以便在虚拟机之前创建它。 然后,在 storageProfile 节中,指定 VHD 位置的完整 URI,该 URI 引用存储帐户,并且 OS 磁盘和任何数据磁盘都需要它。 以下示例从映像创建一个 OS 磁盘,以及一个大小为 1023 GB 的空数据磁盘:

{
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2017-12-01",
    "name": "[variables('vmName')]",
    "location": "[resourceGroup().location]",
    "dependsOn": [
    "[resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]",
    "[resourceId('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
    ],
    "properties": {
        "hardwareProfile": {...},
        "osProfile": {...},
        "storageProfile": {
            "imageReference": {
                "publisher": "MicrosoftWindowsServer",
                "offer": "WindowsServer",
                "sku": "[parameters('windowsOSVersion')]",
                "version": "latest"
            },
            "osDisk": {
                "name": "osdisk",
                "vhd": {
                    "uri": "[concat(reference(resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))).primaryEndpoints.blob, 'vhds/osdisk.vhd')]"
                },
                "caching": "ReadWrite",
                "createOption": "FromImage"
            },
            "dataDisks": [
                {
                    "name": "datadisk1",
                    "diskSizeGB": 1023,
                    "lun": 0,
                    "vhd": {
                        "uri": "[concat(reference(resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))).primaryEndpoints.blob, 'vhds/datadisk1.vhd')]"
                    },
                    "createOption": "Empty"
                }
            ]
        },
        "networkProfile": {...},
        "diagnosticsProfile": {...}
    }
}

托管磁盘模板的格式

使用 Azure 托管磁盘时,磁盘将成为顶级资源,无需创建和管理存储帐户。 托管磁盘还提供许多非托管磁盘未提供的功能。 API 版本中引入了 2017-03-30 托管磁盘。 以下部分将介绍默认设置,并说明如何进一步自定义您的磁盘。

默认的托管磁盘设置

要创建使用托管磁盘的虚拟机,你不再需要创建存储帐户资源。 在以下模板示例中,与前面的非托管磁盘示例存在一些差异:

  • apiVersion 是用于支持托管磁盘的“virtualMachines”资源类型的版本。
  • osDiskdataDisks 不再引用 VHD 的特定 URI。
  • 在不指定其他属性的情况下进行部署时,磁盘会根据 VM 的大小使用存储类型。 例如,如果您使用的是支持高级存储的 VM 规格(例如名称或规格中包含“s”的规格,如 Standard_DS2_v2),那么默认情况下将配置为使用高级磁盘。 可以通过使用磁盘的 SKU 设置来指定存储类型,从而更改此项。
  • 如果没有为磁盘指定名称,则 OS 磁盘采用格式 <VMName>_OsDisk_1_<randomstring>,每个数据磁盘采用格式 <VMName>_disk<#>_<randomstring>
    • 如果要从自定义映像创建 VM,则会从自定义映像资源中定义的磁盘属性中检索存储帐户类型和磁盘名称的默认设置。 可以通过在模板中指定这些值来替代它们。
  • 默认情况下,OS 磁盘的磁盘缓存为 读/写 ,对于数据磁盘,磁盘缓存 为 None
  • 在以下示例中,仍存在存储帐户依赖项,但这只是用于诊断存储,磁盘存储不需要这样做:
{
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2017-12-01",
    "name": "[variables('vmName')]",
    "location": "[resourceGroup().location]",
    "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]",
        "[resourceId('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
    ],
    "properties": {
        "hardwareProfile": {...},
        "osProfile": {...},
        "storageProfile": {
            "imageReference": {
                "publisher": "MicrosoftWindowsServer",
                "offer": "WindowsServer",
                "sku": "[parameters('windowsOSVersion')]",
                "version": "latest"
            },
            "osDisk": {
                "createOption": "FromImage"
            },
            "dataDisks": [
                {
                    "diskSizeGB": 1023,
                    "lun": 0,
                    "createOption": "Empty"
                }
            ]
        },
        "networkProfile": {...},
        "diagnosticsProfile": {...}
    }
}

使用顶级托管磁盘资源

在虚拟机对象中指定磁盘配置的一种替代方法是创建一个顶级磁盘资源,并在创建虚拟机的过程中附加该资源。 请务必将2017-03-30用作disks资源的 API 版本。 例如,可按如下所示创建一个用作数据磁盘的磁盘资源。 在此示例中, vmName 用作磁盘名称的一部分:

{
    "type": "Microsoft.Compute/disks",
    "apiVersion": "2017-03-30",
    "name": "[concat(variables('vmName'),'-datadisk1')]",
    "location": "[resourceGroup().location]",
    "sku": {
        "name": "Standard_LRS"
    },
    "properties": {
        "creationData": {
            "createOption": "Empty"
        },
        "diskSizeGB": 1023
    }
}

在 VM 对象中,引用要附加的磁盘对象。 指定在 managedDisk 属性中创建的托管磁盘的资源 ID 可以在创建 VM 时附加该磁盘。 该 VM 资源的 apiVersion 设置为 2017-12-01。 添加了对磁盘资源的依赖项,以确保在创建 VM 之前已成功创建它:

{
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2017-12-01",
    "name": "[variables('vmName')]",
    "location": "[resourceGroup().location]",
    "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]",
        "[resourceId('Microsoft.Network/networkInterfaces/', variables('nicName'))]",
        "[resourceId('Microsoft.Compute/disks/', concat(variables('vmName'),'-datadisk1'))]"
    ],
    "properties": {
        "hardwareProfile": {...},
        "osProfile": {...},
        "storageProfile": {
            "imageReference": {
                "publisher": "MicrosoftWindowsServer",
                "offer": "WindowsServer",
                "sku": "[parameters('windowsOSVersion')]",
                "version": "latest"
            },
            "osDisk": {
                "createOption": "FromImage"
            },
            "dataDisks": [
                {
                    "lun": 0,
                    "name": "[concat(variables('vmName'),'-datadisk1')]",
                    "createOption": "attach",
                    "managedDisk": {
                        "id": "[resourceId('Microsoft.Compute/disks/', concat(variables('vmName'),'-datadisk1'))]"
                    }
                }
            ]
        },
        "networkProfile": {...},
        "diagnosticsProfile": {...}
    }
}

使用托管磁盘创建包含 VM 的托管可用性集

若要使用托管磁盘创建包含 VM 的托管可用性集,请将 sku 对象添加到可用性集资源,并将 name 属性设置为 Aligned。 该属性可确保每个 VM 的磁盘彼此充分隔离,避免发生单点故障。 另请注意, apiVersion 可用性集资源设置为 2017-12-01

{
    "type": "Microsoft.Compute/availabilitySets",
    "apiVersion": "2017-12-01",
    "location": "[resourceGroup().location]",
    "name": "[variables('avSetName')]",
    "properties": {
        "PlatformUpdateDomainCount": 1,
        "PlatformFaultDomainCount": 2
    },
    "sku": {
        "name": "Aligned"
    }
}

后续步骤