Características y extensiones de las máquinas virtuales para Windows

Las extensiones de máquina virtual (VM) de Azure son aplicaciones pequeñas que realizan tareas de automatización y configuración posterior a la implementación en máquinas virtuales de Azure. Por ejemplo, si una máquina virtual necesita que se instale software, protección antivirus o la capacidad para ejecutar un script en ella, se puede usar una extensión de máquina virtual.

Puede ejecutar las extensiones de máquina virtual de Azure con la CLI de Azure, PowerShell, plantillas de Azure Resource Manager (plantilla de ARM) y Azure Portal. Puede empaquetar extensiones implementando una máquina virtual nueva o ejecutándolas en cualquier sistema existente.

Este artículo proporciona información general sobre las extensiones de máquina virtual, requisitos previos para usarlas e instrucciones sobre cómo detectar, administrar y quitarlas. En este artículo se proporciona información generalizada porque hay muchas extensiones de máquina virtual disponibles. Cada una tiene una configuración potencialmente única y su propia documentación.

Casos de uso y ejemplos

Cada extensión de máquina virtual de Azure tiene un caso de uso específico. Algunos ejemplos son:

Además de las extensiones específicas de proceso, una extensión de script personalizado está disponible tanto para máquinas virtuales Windows como para máquinas virtuales Linux. La extensión de script personalizado para Windows permite que se ejecute cualquier script de PowerShell en una máquina virtual. Los scripts personalizados resultan útiles para diseñar implementaciones de Azure que requieren una configuración más allá de lo que las herramientas de Azure nativas pueden proporcionar.

Requisitos previos

Agente de máquina virtual de Azure

Para controlar la extensión en la máquina virtual, necesita el agente de máquina virtual de Azure para Windows (también denominado agente invitado de Windows) instalado. Algunas extensiones individuales tienen requisitos previos, como el acceso a los recursos o las dependencias.

El agente de máquina virtual de Azure administra las interacciones entre una máquina virtual de Azure y el controlador de tejido de Azure. El agente es responsable de muchos aspectos funcionales de la implementación y administración de las máquinas virtuales de Azure, incluida la ejecución de extensiones de máquina virtual.

El agente de máquina virtual de Azure está preinstalado en imágenes de Azure Marketplace. También se puede instalar manualmente en sistemas operativos compatibles.

El agente se ejecuta en varios sistemas operativos. Sin embargo, el marco de extensiones tiene un límite para los sistemas operativos que las extensiones usan. Algunas extensiones no son compatibles con todos los sistemas operativos y puede aparecer el código de error 51 ("Sistema operativo no compatible"). Revise la documentación de cada una de las extensiones para información sobre la compatibilidad.

Acceso de red

Los paquetes de extensión se descargan desde el repositorio de extensiones de Azure Storage. Las cargas de estado de extensión se publican en Azure Storage.

Si usa una versión compatible del agente de máquina virtual de Azure, no es necesario permitir el acceso a Azure Storage en la región de máquina virtual. Puede usar el agente para redirigir la comunicación al controlador de tejido de Azure para las comunicaciones del agente (característica HostGAPlugin a través del canal con privilegios en la dirección IP privada 168.63.129.16). Si usa una versión no compatible del agente, deberá autorizar el acceso saliente a Azure Storage en esa región desde la máquina virtual.

Importante

Si ha bloqueado el acceso a 168.63.129.16 mediante el firewall de invitado o mediante un proxy, las extensiones producirán un error incluso si usa una versión compatible del agente o si ha configurado el acceso saliente. Se requieren los puertos 80, 443 y 32526.

Los agentes solo se pueden usar para descargar los paquetes de extensiones e informar el estado. Por ejemplo, si la instalación de una extensión requiere descargar un script de GitHub (extensión de script personalizado) o necesita acceso a Azure Storage (Azure Backup), deberá abrir puertos adicionales del firewall o del grupo de seguridad de red (NSG). Cada extensión posee requisitos distintos, porque son aplicaciones por sí mismas. En el caso de las extensiones que requieren acceso a Azure Storage o Azure Active Directory, puede permitir el acceso mediante las etiquetas del servicio NSG de Azure.

El agente de máquina virtual de Azure no es compatible con el servidor de proxy para que redirija las solicitudes de tráfico del agente a través de él. Esto significa que el agente de máquina virtual de Azure se basará en el proxy personalizado (si tiene uno) para acceder a los recursos en Internet o en el host a través de la dirección IP 168.63.129.16.

Detección de extensiones de máquina virtual

Hay muchas extensiones de máquina virtual diferentes disponibles para su uso con máquinas virtuales de Azure. Para ver una lista completa, use Get-AzVMExtensionImage. En el ejemplo siguiente se muestran todas las extensiones disponibles en la ubicación WestUS:

Get-AzVmImagePublisher -Location "WestUS" |
Get-AzVMExtensionImageType |
Get-AzVMExtensionImage | Select Type, Version

Ejecución de extensiones de máquina virtual

Las extensiones de máquina virtual de Azure se ejecutan en máquinas virtuales existentes. Esto resulta útil cuando necesita realizar cambios de configuración o recuperar la conectividad en una máquina virtual ya implementada. Las extensiones de máquina virtual también se pueden agrupar con implementaciones de plantillas de ARM. Mediante el uso de extensiones con plantillas de ARM, puede implementar y configurar máquinas virtuales de Azure sin intervención posterior a la implementación.

Puede usar los métodos siguientes para ejecutar una extensión en una máquina virtual existente.

PowerShell

Existen varios comandos de PowerShell para ejecutar extensiones individuales. Para ver una lista, use Get-Command y filtre por Extensión:

Get-Command Set-Az*Extension* -Module Az.Compute

Este comando proporciona una salida similar a la siguiente:

CommandType     Name                                          Version    Source
-----------     ----                                          -------    ------
Cmdlet          Set-AzVMAccessExtension                       4.5.0      Az.Compute
Cmdlet          Set-AzVMADDomainExtension                     4.5.0      Az.Compute
Cmdlet          Set-AzVMAEMExtension                          4.5.0      Az.Compute
Cmdlet          Set-AzVMBackupExtension                       4.5.0      Az.Compute
Cmdlet          Set-AzVMBginfoExtension                       4.5.0      Az.Compute
Cmdlet          Set-AzVMChefExtension                         4.5.0      Az.Compute
Cmdlet          Set-AzVMCustomScriptExtension                 4.5.0      Az.Compute
Cmdlet          Set-AzVMDiagnosticsExtension                  4.5.0      Az.Compute
Cmdlet          Set-AzVMDiskEncryptionExtension               4.5.0      Az.Compute
Cmdlet          Set-AzVMDscExtension                          4.5.0      Az.Compute
Cmdlet          Set-AzVMExtension                             4.5.0      Az.Compute
Cmdlet          Set-AzVMSqlServerExtension                    4.5.0      Az.Compute
Cmdlet          Set-AzVmssDiskEncryptionExtension             4.5.0      Az.Compute

En el ejemplo siguiente se usa la extensión de script personalizado para descargar un script desde un repositorio de GitHub en la máquina virtual de destino y, a continuación, ejecutar el script:

Set-AzVMCustomScriptExtension -ResourceGroupName "myResourceGroup" `
    -VMName "myVM" -Name "myCustomScript" `
    -FileUri "https://raw.githubusercontent.com/neilpeterson/nepeters-azure-templates/master/windows-custom-script-simple/support-scripts/Create-File.ps1" `
    -Run "Create-File.ps1" -Location "West US"

En el ejemplo siguiente se usa la extensión de VMAccess para restablecer la contraseña administrativa de una máquina virtual Windows como una contraseña temporal. Una vez que ejecute este código, deberá restablecer la contraseña en el primer inicio de sesión.

$cred=Get-Credential

Set-AzVMAccessExtension -ResourceGroupName "myResourceGroup" -VMName "myVM" -Name "myVMAccess" `
    -Location WestUS -UserName $cred.GetNetworkCredential().Username `
    -Password $cred.GetNetworkCredential().Password -typeHandlerVersion "2.0"

Puede usar el comando Set-AzVMExtension para iniciar cualquier extensión de máquina virtual.

Azure Portal

Puede aplicar las extensiones de máquina virtual a una máquina virtual existente a través de Azure Portal. Seleccione la máquina virtual en el portal, elija Extensiones y, luego, Agregar. Elija la extensión que quiera en la lista de extensiones disponibles y siga las instrucciones del asistente.

En el ejemplo siguiente se muestra la instalación de la extensión de Microsoft Antimalware desde Azure Portal:

Screenshot of the dialog for installing the Microsoft Antimalware extension.

Plantillas del Administrador de recursos de Azure

Puede agregar extensiones de máquina virtual a una plantilla de ARM y ejecutarlas con la implementación de la plantilla. Al implementar una extensión con una plantilla, puede crear implementaciones de Azure completamente configuradas.

Por ejemplo, el siguiente JSON procede de una plantilla de ARM completa que implementa un conjunto de máquinas virtuales de carga equilibrada y una base de datos de Azure SQL y, a continuación, instala una aplicación .NET Core en cada máquina virtual. La extensión de máquina virtual se encarga de la instalación de software.

{
    "apiVersion": "2015-06-15",
    "type": "extensions",
    "name": "config-app",
    "location": "[resourceGroup().location]",
    "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', variables('vmName'),copyindex())]",
    "[variables('musicstoresqlName')]"
    ],
    "tags": {
    "displayName": "config-app"
    },
    "properties": {
    "publisher": "Microsoft.Compute",
    "type": "CustomScriptExtension",
    "typeHandlerVersion": "1.9",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-windows/scripts/configure-music-app.ps1"
        ]
    },
    "protectedSettings": {
        "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File configure-music-app.ps1 -user ',parameters('adminUsername'),' -password ',parameters('adminPassword'),' -sqlserver ',variables('musicstoresqlName'),'.database.windows.net')]"
    }
    }
}

Para más información sobre como crear plantillas de ARM, consulte el artículo Máquinas virtuales de una plantilla de Azure Resource Manager.

Protección de datos de extensión de máquina virtual

Cuando ejecuta una extensión de máquina virtual, puede que sea necesario incluir información confidencial como credenciales, nombres de cuenta de almacenamiento y claves de acceso. Muchas extensiones de máquina virtual incluyen una configuración protegida que cifra datos y los descifra solo dentro de la máquina virtual de destino. Cada extensión tiene un esquema específico de configuración protegida que se detalla de forma individual en la documentación específica de extensión.

En el ejemplo siguiente se muestra una instancia de la extensión de script personalizado para Windows. El comando que se ejecuta incluye un conjunto de credenciales. En este ejemplo, el comando que se ejecutará no está cifrado.

{
    "apiVersion": "2015-06-15",
    "type": "extensions",
    "name": "config-app",
    "location": "[resourceGroup().location]",
    "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', variables('vmName'),copyindex())]",
    "[variables('musicstoresqlName')]"
    ],
    "tags": {
    "displayName": "config-app"
    },
    "properties": {
    "publisher": "Microsoft.Compute",
    "type": "CustomScriptExtension",
    "typeHandlerVersion": "1.9",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-windows/scripts/configure-music-app.ps1"
        ],
        "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File configure-music-app.ps1 -user ',parameters('adminUsername'),' -password ',parameters('adminPassword'),' -sqlserver ',variables('musicstoresqlName'),'.database.windows.net')]"
    }
    }
}

Mover la propiedad commandToExecute a la configuración protected ayuda a proteger la cadena de ejecución, tal como se muestra en el ejemplo siguiente:

{
    "apiVersion": "2015-06-15",
    "type": "extensions",
    "name": "config-app",
    "location": "[resourceGroup().location]",
    "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', variables('vmName'),copyindex())]",
    "[variables('musicstoresqlName')]"
    ],
    "tags": {
    "displayName": "config-app"
    },
    "properties": {
    "publisher": "Microsoft.Compute",
    "type": "CustomScriptExtension",
    "typeHandlerVersion": "1.9",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-windows/scripts/configure-music-app.ps1"
        ]
    },
    "protectedSettings": {
        "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File configure-music-app.ps1 -user ',parameters('adminUsername'),' -password ',parameters('adminPassword'),' -sqlserver ',variables('musicstoresqlName'),'.database.windows.net')]"
    }
    }
}

En una máquina virtual de infraestructura como servicio (IaaS) de Azure que usa extensiones, en la consola de certificados, es posible que vea certificados que tienen el asunto Generador de certificados CRP de Windows Azure. En una máquina virtual de RedDog Front End (RDFE) clásica, estos certificados tienen el nombre de asunto Administración de servicios de Windows Azure para extensiones.

Estos certificados protegen la comunicación entre la máquina virtual y su host durante la transferencia de los valores protegidos (contraseña y otras credenciales) que las extensiones usan. Los certificados se compilan mediante el controlador de tejido de Azure y se pasan al agente de máquina virtual de Azure. Si detiene e inicia la máquina virtual cada día, el controlador de tejido puede crear un certificado. El certificado se almacena en el almacén de certificados personales del equipo. Estos certificados se pueden eliminar. El agente de máquina virtual de Azure puede volver a crear certificados si es necesario.

Cómo se actualizan los agentes y las extensiones

Los agentes y las extensiones comparten el mismo mecanismo de actualización.

Cuando hay una actualización disponible y las actualizaciones automáticas están habilitadas, la actualización se instala en la máquina virtual solo después de que se haya realizado un cambio en una extensión o después de otro cambio de modelo de VM, como:

  • Discos de datos.
  • Extensiones
  • Etiquetas de extensión
  • Contenedor de diagnósticos de arranque
  • Secretos del sistema operativo invitado
  • Tamaño de VM
  • Perfil de red

Los publicadores hacen que las actualizaciones estén disponibles en distintos momentos en varias regiones, por lo que es posible que tenga máquinas virtuales en distintas regiones con versiones diferentes.

Nota

Es posible que algunas actualizaciones necesiten reglas de firewall adicionales. Consulte Acceso de red.

Lista de extensiones implementadas en una máquina virtual

$vm = Get-AzVM -ResourceGroupName "myResourceGroup" -VMName "myVM"
$vm.Extensions | select Publisher, VirtualMachineExtensionType, TypeHandlerVersion
Publisher             VirtualMachineExtensionType          TypeHandlerVersion
---------             ---------------------------          ------------------
Microsoft.Compute     CustomScriptExtension                1.9

Actualizaciones del agente

El agente de máquina virtual de Azure solo contiene código de control de extensiones. El código de aprovisionamiento de Windows es independiente. Puede desinstalar el agente de máquina virtual de Azure. No se puede deshabilitar la actualización automática del agente de máquina virtual de Azure.

El código de control de extensiones es responsable de lo siguiente:

  • Comunicación con el tejido de Azure.
  • Control de las operaciones de extensión de máquina virtual, como instalaciones, informes de estado, actualización de las extensiones individuales y eliminación de extensiones. Las actualizaciones contienen revisiones de seguridad, correcciones de errores y mejoras en el código de control de extensiones.

Para comprobar qué versión está ejecutando, vea Detección del agente de VM.

Actualizaciones de extensiones

Cuando hay una actualización de extensión disponible y las actualizaciones automáticas están habilitadas, después de que se produce un cambio en el modelo de VM, el agente de máquina virtual de Azure descarga y actualiza la extensión.

Las actualizaciones de extensiones automáticas son secundarias o revisiones. Puede optar por recibir, o no, las actualizaciones secundarias cuando aprovisiona la extensión. En el ejemplo siguiente se muestra cómo actualizar automáticamente versiones secundarias en una plantilla de ARM mediante "autoUpgradeMinorVersion": true,:

    "properties": {
    "publisher": "Microsoft.Compute",
    "type": "CustomScriptExtension",
    "typeHandlerVersion": "1.9",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-windows/scripts/configure-music-app.ps1"
        ]
    },

Para obtener las correcciones de errores secundarias más recientes, se recomienda encarecidamente que siempre seleccione la actualización automática en las implementaciones de sus extensiones. No es posible optar por no recibir actualizaciones de revisiones que incluyen correcciones de errores clave o de seguridad.

Si deshabilita las actualizaciones automáticas o necesita actualizar una versión principal, utilice Set-AzVMExtension y especifique la versión de destino.

Identificación de las actualizaciones de extensiones

Identificación de si la extensión tiene establecida la opción autoUpgradeMinorVersion en una máquina virtual

En el modelo de la máquina virtual puede ver si la extensión se aprovisionó con autoUpgradeMinorVersion. Para comprobarlo, use Get-AzVm y proporcione el nombre de la VM y el grupo de recursos como se indica a continuación:

 $vm = Get-AzVm -ResourceGroupName "myResourceGroup" -VMName "myVM"
 $vm.Extensions

En la siguiente salida de ejemplo se muestra que autoUpgradeMinorVersion está establecido en true:

ForceUpdateTag              :
Publisher                   : Microsoft.Compute
VirtualMachineExtensionType : CustomScriptExtension
TypeHandlerVersion          : 1.9
AutoUpgradeMinorVersion     : True

Identificación de cuándo se produjo un evento autoUpgradeMinorVersion

Para ver cuando se produce una actualización de la extensión, revise los registros del agente de la máquina virtual en C:\WindowsAzure\Logs\WaAppAgent.log.

En el ejemplo siguiente, la máquina virtual tenía instalada la versión 1.8 de Microsoft.Compute.CustomScriptExtension. Hubo una revisión disponible para la versión 1.9.

[INFO]  Getting plugin locations for plugin 'Microsoft.Compute.CustomScriptExtension'. Current Version: '1.8', Requested Version: '1.9'
[INFO]  Auto-Upgrade mode. Highest public version for plugin 'Microsoft.Compute.CustomScriptExtension' with requested version: '1.9', is: '1.9'

Permisos del agente

Para realizar sus tareas, el agente se debe ejecutar como sistema local.

Solución de problemas de extensiones de máquina virtual

Cada extensión de máquina virtual puede tener unos pasos de solución de problemas específicos. Por ejemplo, cuando usa la extensión de script personalizado, puede encontrar los detalles de ejecución de script localmente en la máquina virtual donde se ejecutó la extensión.

Las acciones de solución de problemas siguientes se aplican a todas las extensiones de máquina virtual:

  • Para comprobar el registro del agente de máquina virtual de Azure, consulte la actividad cuando la extensión se aprovisionaba en C:\WindowsAzure\Logs\WaAppAgent.log.

  • Revise los registros de la extensión para ver más detalles en C:\WindowsAzure\Logs\Plugins<NombreDeLaExtensión>.

  • Consulte las secciones de solución de problemas de la documentación específica de la extensión para obtener códigos de error, problemas conocidos y otra información específica de la extensión.

  • Examine los registros del sistema. Compruebe si hay otras operaciones que puedan haber interferido con la extensión, como una instalación de ejecución prolongada de otra aplicación que requería acceso exclusivo al administrador de paquetes.

  • En una máquina virtual, si hay una extensión existente con un estado de aprovisionamiento con errores, no se podrá instalar ninguna extensión nueva.

Motivos comunes para los errores de extensiones

  • Las extensiones tienen 20 minutos para ejecutarse. (Las excepciones son Script personalizado, Chef y DSC, que tienen 90 minutos). Si la implementación supera este tiempo, se marca como tiempo de espera. La causa de esto puede ser que las máquinas virtuales con pocos recursos u otras configuraciones de máquina virtual o tareas de inicio consumen grandes cantidades de recursos mientras la extensión intenta aprovisionarse.

  • No se cumplen los requisitos previos mínimos. Algunas extensiones tienen dependencias de las SKU de la máquina virtual, como las imágenes de HPC. Las extensiones pueden tener ciertos requisitos de acceso de red, como comunicaciones con Azure Storage o servicios públicos. Otros ejemplos podrían ser el acceso a repositorios de paquetes, quedarse sin espacio en disco o restricciones de seguridad.

  • El acceso al administrador de paquetes es exclusivo. En algunos casos, la configuración de máquina virtual de ejecución prolongada y la instalación de la extensión podrían entrar en conflicto, puesto que ambas necesitan acceso exclusivo al administrador de paquetes.

Consulta del estado de la extensión

Después de que una extensión de máquina virtual se ejecuta en una máquina virtual, use Get-AzVM para devolver el estado de la extensión. Substatuses[0] muestra que el aprovisionamiento de la extensión se ha realizado correctamente, lo que significa que se implementó correctamente en la máquina virtual. Pero Substatuses[1] muestra que no se pudo ejecutar la extensión dentro de la máquina virtual.

Get-AzVM -ResourceGroupName "myResourceGroup" -VMName "myVM" -Status

La salida es similar a la del ejemplo siguiente:

Extensions[0]           :
  Name                  : CustomScriptExtension
  Type                  : Microsoft.Compute.CustomScriptExtension
  TypeHandlerVersion    : 1.9
  Substatuses[0]        :
    Code                : ComponentStatus/StdOut/succeeded
    Level               : Info
    DisplayStatus       : Provisioning succeeded
    Message             : Windows PowerShell \nCopyright (C) Microsoft Corporation. All rights reserved.\n
  Substatuses[1]        :
    Code                : ComponentStatus/StdErr/succeeded
    Level               : Info
    DisplayStatus       : Provisioning succeeded
    Message             : The argument 'cseTest%20Scriptparam1.ps1' to the -File parameter does not exist. Provide the path to an existing '.ps1' file as an argument to the

-File parameter.
  Statuses[0]           :
    Code                : ProvisioningState/failed/-196608
    Level               : Error
    DisplayStatus       : Provisioning failed
    Message             : Finished executing command

También puede encontrar el estado de ejecución de la extensión en Azure Portal. Seleccione la máquina virtual, seleccione Extensiones y, a continuación, seleccione la extensión deseada.

Repetición de ejecución de una extensión de máquina virtual

Puede haber casos en los que sea necesario volver a ejecutar una extensión de máquina virtual. Puede volver ejecutar la extensión si la quita y la vuelve a ejecutar con un método de ejecución de su elección. Para quitar una extensión, use Remove-AzVMExtension como se indica a continuación:

Remove-AzVMExtension -ResourceGroupName "myResourceGroup" -VMName "myVM" -Name "myExtensionName"

También puede quitar una extensión en Azure Portal:

  1. Seleccione una máquina virtual.
  2. Seleccione Extensiones.
  3. Seleccione la extensión.
  4. Seleccione Desinstalar.

Referencia de extensión de máquina virtual común

Nombre de la extensión Descripción
Extensión de script personalizado para Windows Ejecución de scripts en una máquina virtual de Azure
Extensión DSC para Windows Aplicación de las configuraciones de estado deseadas de PowerShell a una máquina virtual
Extensión de Diagnósticos de Azure Administración de Azure Diagnostics
Extensión VMAccess Administración de usuarios y credenciales

Pasos siguientes

Para más información sobre las extensiones de máquina virtual, consulte Características y extensiones de las máquinas virtuales de Azure.