Utilizar modelos de discos geridos de VM

Este artigo descreve as diferenças entre discos geridos e não geridos ao utilizar modelos de Resource Manager do Azure para aprovisionar máquinas virtuais no Azure Stack Hub. Os exemplos ajudam-no a converter modelos existentes que utilizam discos não geridos em discos geridos.

Formatação de modelos de discos não geridos

Para começar, vamos ver como os discos não geridos são implementados. Ao criar discos não geridos, precisa de uma conta de armazenamento para armazenar os ficheiros VHD. Pode criar uma nova conta de armazenamento ou utilizar uma que já exista. Crie um novo recurso de conta de armazenamento no bloco de recursos do modelo, da seguinte forma:

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

No objeto da máquina virtual, adicione uma dependência na conta de armazenamento para garantir que é criada antes da máquina virtual. storageProfile Na secção , especifique o URI completo da localização do VHD, que referencia a conta de armazenamento e é necessário para o disco do SO e quaisquer discos de dados. O exemplo seguinte cria um disco do SO a partir de uma imagem e um disco de dados vazio com um tamanho de 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": {...}
    }
}

Formatação de modelos de discos geridos

Com os discos geridos do Azure, o disco torna-se um recurso de nível superior e já não requer a criação de uma conta de armazenamento pelo utilizador. Os discos geridos foram introduzidos pela primeira vez na versão da 2017-03-30 API. As secções seguintes percorrem as predefinições e explicam como personalizar ainda mais os discos.

Predefinições de disco gerido

Para criar uma VM com discos geridos, já não precisa de criar o recurso da conta de armazenamento. No exemplo de modelo abaixo, existem algumas diferenças face aos exemplos anteriores de discos não geridos:

  • O apiVersion é uma versão para um tipo de recurso "virtualMachines" que suporta discos geridos.
  • osDisk e dataDisks já não se refere a um URI específico para o VHD.
  • Ao implementar sem especificar propriedades adicionais, o disco utiliza um tipo de armazenamento com base no tamanho da VM. Por exemplo, se estiver a utilizar um tamanho de VM que suporte armazenamento premium (tamanhos com "s" no respetivo nome, como Standard_DS2_v2), os discos premium serão configurados por predefinição. Pode alterar esta opção ao utilizar a definição de SKU do disco para especificar um tipo de armazenamento.
  • Se não for especificado nenhum nome para o disco, utiliza o formato de para o disco do <VMName>_OsDisk_1_<randomstring> SO e <VMName>_disk<#>_<randomstring> para cada disco de dados.
    • Se uma VM estiver a ser criada a partir de uma imagem personalizada, as predefinições para o tipo de conta de armazenamento e o nome do disco são obtidas a partir das propriedades do disco definidas no recurso de imagem personalizada. Estes podem ser substituídos ao especificar valores para estes no modelo.
  • Por predefinição, a colocação em cache do disco é de leitura/escrita para o disco do SO e Nenhuma para discos de dados.
  • No exemplo seguinte, ainda existe uma dependência de conta de armazenamento, embora isto seja apenas para armazenamento de diagnósticos e não é necessário para o armazenamento em disco:
{
    "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": {...}
    }
}

Utilizar um recurso de disco gerido de nível superior

Como alternativa à especificação da configuração do disco no objeto de máquina virtual, pode criar um recurso de disco de nível superior e anexá-lo como parte da criação da máquina virtual. Certifique-se de que utiliza 2017-03-30 como a versão da disks API de recursos. Por exemplo, pode criar um recurso de disco da seguinte forma para utilizar como um disco de dados. Neste exemplo, vmName é utilizado como parte do nome do disco:

{
    "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
    }
}

No objeto da VM, referencie o objeto de disco a anexar. Especificar o ID de recurso do disco gerido criado na managedDisk propriedade permite o anexo do disco à medida que a VM é criada. O apiVersion para o recurso da VM está definido como 2017-12-01. É adicionada uma dependência no recurso do disco para garantir que foi criado com êxito antes da criação da 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": {...}
    }
}

Criar conjuntos de disponibilidade geridos com VMs com discos geridos

Para criar conjuntos de disponibilidade geridos com VMs com discos geridos, adicione o sku objeto ao recurso do conjunto de disponibilidade e defina a name propriedade como Aligned. Esta propriedade garante que os discos de cada VM estão suficientemente isolados uns dos outros para evitar pontos únicos de falha. Tenha também em atenção que o apiVersion para o recurso do conjunto de disponibilidade está definido como 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"
    }
}

Passos seguintes