Uso de Azure Managed Disks con las bibliotecas de Azure (SDK) para Python

Azure Managed Disks son un almacenamiento en bloques duradero y de alto rendimiento diseñado para usarse con Azure Virtual Machines y Azure VMware Solution. Azure Managed Disks proporciona administración simplificada de discos, escalabilidad mejorada, seguridad mejorada y mejor escalado sin tener que trabajar directamente con cuentas de almacenamiento. Para más información, consulte Azure Managed Disks.

La biblioteca se usa azure-mgmt-compute para administrar Managed Disks para una máquina virtual existente.

Para obtener un ejemplo de cómo crear una máquina virtual con la azure-mgmt-compute biblioteca, consulte Ejemplo: Creación de una máquina virtual.

Los ejemplos de código de este artículo muestran cómo realizar algunas tareas comunes con discos administrados mediante la azure-mgmt-compute biblioteca. No se pueden ejecutar tal como está, pero están diseñados para incorporarse en su propio código. Puede consultar Ejemplo: Creación de una máquina virtual para obtener información sobre cómo crear una instancia de azure.mgmt.compute ComputeManagementClient en el código para ejecutar los ejemplos.

Para obtener ejemplos más completos de cómo usar la azure-mgmt-compute biblioteca, consulte Ejemplos de Azure SDK para Python para el proceso en GitHub.

Discos administrados independientes

Puede crear discos administrados independientes de muchas maneras, como se muestra en las secciones siguientes.

Crear un disco administrado vacío

from azure.mgmt.compute.models import DiskCreateOption

poller = compute_client.disks.begin_create_or_update(
    'my_resource_group',
    'my_disk_name',
    {
        'location': 'eastus',
        'disk_size_gb': 20,
        'creation_data': {
            'create_option': DiskCreateOption.empty
        }
    }
)
disk_resource = poller.result()

Crear un disco administrado a partir de Blob Storage

El disco administrado se crea a partir de un disco duro virtual (VHD) almacenado como un blob.

from azure.mgmt.compute.models import DiskCreateOption

poller = compute_client.disks.begin_create_or_update(
    'my_resource_group',
    'my_disk_name',
    {
        'location': 'eastus',
        'creation_data': {
            'create_option': DiskCreateOption.IMPORT,
            'storage_account_id': '/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Storage/storageAccounts/<storage-account-name>',
            'source_uri': 'https://<storage-account-name>.blob.core.windows.net/vm-images/test.vhd'
        }
    }
)
disk_resource = poller.result()

Crear una imagen de disco administrado a partir de Blob Storage

La imagen de disco administrado se crea a partir de un disco duro virtual (VHD) almacenado como un blob.

from azure.mgmt.compute.models import OperatingSystemStateTypes, HyperVGeneration

poller = compute_client.images.begin_create_or_update(
    'my_resource_group',
    'my_image_name',
    {
        'location': 'eastus',
        'storage_profile': {
           'os_disk': {
              'os_type': 'Linux',
              'os_state': OperatingSystemStateTypes.GENERALIZED,
              'blob_uri': 'https://<storage-account-name>.blob.core.windows.net/vm-images/test.vhd',
              'caching': "ReadWrite",
           },
        },
        'hyper_v_generation': HyperVGeneration.V2,
    }
)
image_resource = poller.result()

Crear un disco administrado a partir de una imagen de su propiedad

from azure.mgmt.compute.models import DiskCreateOption

# If you don't know the id, do a 'get' like this to obtain it
managed_disk = compute_client.disks.get(self.group_name, 'myImageDisk')

poller = compute_client.disks.begin_create_or_update(
    'my_resource_group',
    'my_disk_name',
    {
        'location': 'eastus',
        'creation_data': {
            'create_option': DiskCreateOption.COPY,
            'source_resource_id': managed_disk.id
        }
    }
)

disk_resource = poller.result()

Máquina virtual con discos administrados

Puede crear una máquina virtual con un disco administrado implícito para una imagen de disco específica, lo que le evita tener que especificar todos los detalles.

Un disco administrado se crea implícitamente al crear una máquina virtual a partir de una imagen del sistema operativo en Azure. En el parámetro storage_profile, el elemento os_disk es opcional y no es necesario crear una cuenta de almacenamiento como condición previa necesaria para crear una máquina virtual.

storage_profile = azure.mgmt.compute.models.StorageProfile(
    image_reference = azure.mgmt.compute.models.ImageReference(
        publisher='Canonical',
        offer='UbuntuServer',
        sku='16.04-LTS',
        version='latest'
    )
)

Para obtener un ejemplo completo sobre cómo crear una máquina virtual mediante las bibliotecas de administración de Azure, para Python, consulte Ejemplo: Creación de una máquina virtual. En el ejemplo de creación, se usa el storage_profile parámetro .

También puede crear una storage_profile con sus propias imágenes.

# If you don't know the id, do a 'get' like this to obtain it
image = compute_client.images.get(self.group_name, 'myImageDisk')

storage_profile = azure.mgmt.compute.models.StorageProfile(
    image_reference = azure.mgmt.compute.models.ImageReference(
        id = image.id
    )
)

Puede conectar fácilmente un disco administrado aprovisionado anteriormente:

vm = compute_client.virtual_machines.get(
    'my_resource_group',
    'my_vm'
)
managed_disk = compute_client.disks.get('my_resource_group', 'myDisk')

vm.storage_profile.data_disks.append({
    'lun': 12, # You choose the value, depending of what is available for you
    'name': managed_disk.name,
    'create_option': DiskCreateOptionTypes.attach,
    'managed_disk': {
        'id': managed_disk.id
    }
})

async_update = compute_client.virtual_machines.begin_create_or_update(
    'my_resource_group',
    vm.name,
    vm,
)
async_update.wait()

Conjuntos de escalado de máquinas virtuales con discos administrados

Antes de los discos administrados, había que crear manualmente una cuenta de almacenamiento para todas las máquinas virtuales que quería dentro del conjunto de escalado y, a continuación, usar el parámetro de lista vhd_containers para proporcionar el nombre de todas las cuentas de almacenamiento a la API de REST del conjunto de escalado.

Dado que no tiene que administrar cuentas de almacenamiento con Azure Managed Disks, el storage_profile para virtual Machine Scale Sets ahora puede ser exactamente el mismo que el usado en la creación de máquinas virtuales:

'storage_profile': {
    'image_reference': {
        "publisher": "Canonical",
        "offer": "UbuntuServer",
        "sku": "16.04-LTS",
        "version": "latest"
    }
},

El ejemplo completo es el siguiente:

naming_infix = "PyTestInfix"

vmss_parameters = {
    'location': self.region,
    "overprovision": True,
    "upgrade_policy": {
        "mode": "Manual"
    },
    'sku': {
        'name': 'Standard_A1',
        'tier': 'Standard',
        'capacity': 5
    },
    'virtual_machine_profile': {
        'storage_profile': {
            'image_reference': {
                "publisher": "Canonical",
                "offer": "UbuntuServer",
                "sku": "16.04-LTS",
                "version": "latest"
            }
        },
        'os_profile': {
            'computer_name_prefix': naming_infix,
            'admin_username': 'Foo12',
            'admin_password': 'BaR@123!!!!',
        },
        'network_profile': {
            'network_interface_configurations' : [{
                'name': naming_infix + 'nic',
                "primary": True,
                'ip_configurations': [{
                    'name': naming_infix + 'ipconfig',
                    'subnet': {
                        'id': subnet.id
                    }
                }]
            }]
        }
    }
}

# Create VMSS test
result_create = compute_client.virtual_machine_scale_sets.begin_create_or_update(
    'my_resource_group',
    'my_scale_set',
    vmss_parameters,
)
vmss_result = result_create.result()

Otras operaciones con discos administrados

Cambio del tamaño de un disco administrado

managed_disk = compute_client.disks.get('my_resource_group', 'myDisk')
managed_disk.disk_size_gb = 25

async_update = self.compute_client.disks.begin_create_or_update(
    'my_resource_group',
    'myDisk',
    managed_disk
)
async_update.wait()

Actualización del tipo de cuenta de almacenamiento de los discos administrados

from azure.mgmt.compute.models import StorageAccountTypes

managed_disk = compute_client.disks.get('my_resource_group', 'myDisk')
managed_disk.account_type = StorageAccountTypes.STANDARD_LRS

async_update = self.compute_client.disks.begin_create_or_update(
    'my_resource_group',
    'myDisk',
    managed_disk
)
async_update.wait()

Crear una imagen a partir de un almacenamiento de blobs

async_create_image = compute_client.images.create_or_update(
    'my_resource_group',
    'myImage',
    {
        'location': 'eastus',
        'storage_profile': {
            'os_disk': {
                'os_type': 'Linux',
                'os_state': "Generalized",
                'blob_uri': 'https://<storage-account-name>.blob.core.windows.net/vm-images/test.vhd',
                'caching': "ReadWrite",
            }
        }
    }
)
image = async_create_image.result()

Creación de una instantánea de un disco administrado que esté asociado actualmente a una máquina virtual

managed_disk = compute_client.disks.get('my_resource_group', 'myDisk')

async_snapshot_creation = self.compute_client.snapshots.begin_create_or_update(
        'my_resource_group',
        'mySnapshot',
        {
            'location': 'eastus',
            'creation_data': {
                'create_option': 'Copy',
                'source_uri': managed_disk.id
            }
        }
    )
snapshot = async_snapshot_creation.result()

Consulte también