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

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 Linux permite que se ejecute cualquier script de Bash 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 Linux de Azure

Para controlar la extensión en la máquina virtual, debe tener instalado el Agente Linux de Azure. Algunas extensiones individuales tienen requisitos previos, como el acceso a los recursos o las dependencias.

El agente de Linux 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 Linux 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 Linux 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. 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 la dirección IP privada 168.63.129.16 mediante el firewall de invitado, las extensiones producirán un error incluso si usa una versión compatible del agente o si ha configurado el acceso saliente.

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, puede permitir el acceso mediante las etiquetas del servicio NSG de Azure.

Para redirigir las solicitudes de tráfico del agente, el agente Linux de Azure es compatible con el servidor proxy. Sin embargo, esta compatibilidad con el servidor proxy no se aplica a las extensiones. Debe configurar cada extensión individual para que funcione con un servidor proxy.

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 az vm extension image list. En el ejemplo siguiente se muestran todas las extensiones disponibles en la ubicación westus:

az vm extension image list --location westus --output table

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.

CLI de Azure

Las extensiones de máquina virtual de Azure se pueden ejecutar en una máquina virtual existente con el comando az vm extension set. En el ejemplo siguiente se ejecuta la extensión de script personalizado en una máquina virtual denominada myVM en un grupo de recursos con el nombre myResourceGroup. Reemplace el nombre del grupo de recursos de muestra, el nombre de la máquina virtual y el script que se van a ejecutar (https://raw.githubusercontent.com/me/project/hello.sh)) por su propia información.

az vm extension set \
  --resource-group myResourceGroup \
  --vm-name myVM \
  --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --settings '{"fileUris": ["https://raw.githubusercontent.com/me/project/hello.sh"],"commandToExecute": "./hello.sh"}'

Cuando la extensión se ejecuta correctamente, la salida es similar al ejemplo siguiente:

info:    Executing command vm extension set
+ Looking up the VM "myVM"
+ Installing extension "CustomScript", VM: "mvVM"
info:    vm extension set command OK

Azure PowerShell

Las extensiones de máquina virtual de Azure se pueden ejecutar en una máquina virtual existente con el comando Set-AzVMExtension. En el ejemplo siguiente se ejecuta la extensión de script personalizado en una máquina virtual denominada myVM en un grupo de recursos con el nombre myResourceGroup. Reemplace el nombre del grupo de recursos de muestra, el nombre de la máquina virtual y el script que se van a ejecutar (https://raw.githubusercontent.com/me/project/hello.sh)) por su propia información.

$Params = @{
    ResourceGroupName  = 'myResourceGroup'
    VMName             = 'myVM'
    Name               = 'CustomScript'
    Publisher          = 'Microsoft.Azure.Extensions'
    ExtensionType      = 'CustomScript'
    TypeHandlerVersion = '2.1'
    Settings          = @{fileUris = @('https://raw.githubusercontent.com/me/project/hello.sh'); commandToExecute = './hello.sh'}
}
Set-AzVMExtension @Params

Cuando la extensión se ejecuta correctamente, la salida es similar al ejemplo siguiente:

RequestId IsSuccessStatusCode StatusCode ReasonPhrase
--------- ------------------- ---------- ------------
                         True         OK OK

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 la siguiente imagen se muestra la instalación de la extensión de script personalizado de Linux desde Azure Portal:

Screenshot of the dialog for installing the Custom Script extension for Linux.

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/', concat(variables('vmName'),copyindex()))]"
    ],
    "tags": {
    "displayName": "config-app"
    },
    "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
        ]
    },
    "protectedSettings": {
        "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
    }
}

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 Linux. 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/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
      ],
      "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
  }
}

Al moverse la commandToExecutepropiedad de la protectedconfiguración protege 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/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
      ]
    },
    "protectedSettings": {
      "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
  }
}

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.

Actualizaciones del agente

El agente de máquina virtual Linux contiene código de aprovisionamiento del agente y código de administración de extensiones en un solo paquete. No se pueden separar.

Puede deshabilitar el agente de aprovisionamiento cuando quiera aprovisionar en Azure con cloud-init.

Las versiones compatibles de los agentes pueden usar actualizaciones automáticas. El único código que se puede actualizar es el código de administración de extensiones y no el código de aprovisionamiento del agente. El código de aprovisionamiento del agente solo se ejecuta una vez.

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 administración de extensiones.

Cuando se instala el agente, se crea un demonio primario. Este proceso primario luego genera un proceso secundario que se usa para administrar las extensiones. Si hay una actualización disponible para el agente, se descargará. El elemento primario detiene el proceso secundario, lo actualiza y, a continuación, lo reinicia. Si se produce un problema con la actualización, el proceso primario revierte el elemento secundario a su versión anterior.

El proceso primario no se puede actualizar automáticamente. El elemento primario solo se puede actualizar mediante una actualización del paquete de distribución.

Para comprobar qué versión ejecuta, compruebe waagent de la siguiente manera:

waagent --version

La salida es similar a la del ejemplo siguiente:

WALinuxAgent-2.2.45 running on <Linux Distro>
Python: 3.6.9
Goal state agent: 2.7.1.0

En la salida del ejemplo anterior, el proceso primario (o la versión implementada del paquete) es WALinuxAgent-2.2.45. El valor Goal state agent es la versión de actualización automática.

Se recomienda que siempre tenga activada la actualización automática del agente: AutoUpdate.Enabled=y. Si no habilita la actualización automática, deberá seguir actualizando manualmente el agente y no tendrá correcciones de errores y seguridad.

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 máquina virtual, el agente Linux 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,:

    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
        ]
    },

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 az vm extension set o 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 az vm show y proporcione el nombre de la máquina virtual y el grupo de recursos como se indica a continuación:

az vm show --resource-group myResourceGroup --name myVM

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

  "resources": [
    {
      "autoUpgradeMinorVersion": true,
      "forceUpdateTag": null,
      "id": "/subscriptions/guid/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM/extensions/customScript",

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 /var/log/waagent.log.

En el ejemplo siguiente, la máquina virtual tenía instalado Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025. Hubo una revisión disponible para Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027.

INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Expected handler state: enabled
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Decide which version to use
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Use version: 2.3.9027
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Current handler state is: NotInstalled
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Download extension package
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Unpack extension package
INFO Event: name=Microsoft.OSTCExtensions.LinuxDiagnostic, op=Download, message=Download succeeded
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Initialize extension directory
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Update settings file: 0.settings
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025] Disable extension.
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025] Launch command:diagnostic.py -disable
...
INFO Event: name=Microsoft.OSTCExtensions.LinuxDiagnostic, op=Disable, message=Launch command succeeded: diagnostic.py -disable
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Update extension.
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Launch command:diagnostic.py -update
2017/08/14 20:21:57 LinuxAzureDiagnostic started to handle.

Permisos del agente

Para realizar sus tareas, el agente se debe ejecutar como raíz.

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 Linux de Azure, examine la actividad cuando la extensión se aprovisionó en /var/log/waagent.log.

  • Revise los registros reales de la extensión para ver más detalles en /var/log/azure/<extensionName>.

  • 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.

Motivos comunes para los errores de extensiones

  • Las extensiones tienen 20 minutos para ejecutarse. (Las excepciones son un script personalizado y Chef, 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 az vm get-instance-view para devolver el estado de la extensión como se indica a continuación:

az vm get-instance-view \
    --resource-group myResourceGroup \
    --name myVM \
    --query "instanceView.extensions"

La salida es similar a la del ejemplo siguiente:

  {
    "name": "customScript",
    "statuses": [
      {
        "code": "ProvisioningState/failed/0",
        "displayStatus": "Provisioning failed",
        "level": "Error",
        "message": "Enable failed: failed to execute command: command terminated with exit status=127\n[stdout]\n\n[stderr]\n/bin/sh: 1: ech: not found\n",
        "time": null
      }
    ],
    "substatuses": null,
    "type": "Microsoft.Azure.Extensions.CustomScript",
    "typeHandlerVersion": "2.1.6"
  }

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 az vm extension delete como se indica a continuación:

az vm extension delete \
    --resource-group myResourceGroup \
    --vm-name myVM \
    --name customScript

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 Linux Ejecución de scripts en una máquina virtual de Azure.
Extensión VMAccess Repetición de obtención de acceso a una máquina virtual de Azure. También puede usarlo para administrar usuarios y credenciales.
Extensión de Diagnósticos de Azure Administración de Azure Diagnostics.

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.