Uso de la extensión de script personalizado de Azure versión 2 con máquinas virtuales Linux

Precaución

En este artículo se hace referencia a CentOS, una distribución de Linux que está cerca de su estado Final de ciclo vida (EOL). Tenga en cuenta su uso y planifique en consecuencia. Para obtener más información, consulte la Guía de final de la vida útil de CentOS.

La extensión de script personalizado versión 2 descarga y ejecuta scripts en máquinas virtuales (VM) de Azure. Use esta extensión para la configuración posterior a la implementación, la instalación de software o cualquier otra tarea de configuración o administración. Los scripts se pueden descargar desde Azure Storage u otra ubicación de Internet accesible, o se pueden proporcionar al tiempo de ejecución de la extensión.

La extensión de script personalizado se integra con las plantillas de Azure Resource Manager. También puede ejecutarla mediante la CLI de Azure, Azure PowerShell o la API REST de Azure Virtual Machines.

En este artículo se describe cómo utilizar la extensión de script personalizado desde la CLI de Azure y cómo ejecutar la extensión mediante una plantilla de Azure Resource Manager. En este artículo se proporcionan también los pasos para la solución de problemas para los sistemas Linux.

Hay dos versiones de la extensión de script personalizado:

  • Version 1: Microsoft.OSTCExtensions.CustomScriptForLinux
  • Version 2: Microsoft.Azure.Extensions.CustomScript

Use la versión 2 para implementaciones nuevas y existentes. La nueva versión es un reemplazo de colocación. La migración es muy fácil: solo tiene que cambiar el nombre y la versión. No es necesario cambiar la configuración de la extensión.

Requisitos previos

Distribuciones de Linux compatibles

Distribución x64 ARM64
Alma Linux 9.x o superior 9.x o superior
CentOS 7.x+, 8.x+ 7.x+
Debian 10+ 11.x+
Flatcar Linux 3374.2.x+ 3374.2.x+
Azure Linux 2.x 2.x
openSUSE 12.3+ No compatible
Oracle Linux 6.4+, 7.x+, 8.x+ No compatible
Red Hat Enterprise Linux 6.7+, 7.x+, 8.x+, 9.x+ 8.6 y versiones posteriores, 9.x y versiones posteriores
Rocky Linux 9.x o superior 9.x o superior
SLES 12.x+, 15.x+ 15.x SP4+
Ubuntu 18.04+, 20.04+, 22.04+ 20.04+, 22.04+

Ubicación de los scripts

Puede establecer la extensión de modo que use las credenciales de Azure Blob Storage a fin de acceder a Azure Blob Storage. La ubicación del script puede ser cualquier lugar, siempre y cuando la máquina virtual pueda enrutarse a ese punto de conexión, por ejemplo, GitHub o un servidor de archivos interno.

Conectividad de Internet

Para descargar un script externamente, por ejemplo, desde GitHub o Azure Storage, debe abrir puertos adicionales de firewall o de grupo de seguridad de red (NSG). Por ejemplo, si el script se encuentra en Azure Storage, puede permitir el acceso mediante etiquetas de servicio NSG de Azure para Storage.

Si el script está en un servidor local, es posible que tenga que abrir otros puertos de firewall o NSG.

Sugerencias

  • La mayor tasa de errores para esta extensión se debe a errores de sintaxis en el script. Compruebe que el script se ejecuta sin errores. Coloque otro registro en el script para facilitar la búsqueda de errores.
  • Escriba scripts que sean idempotentes, para que si se ejecutan más de una vez accidentalmente no se produzcan cambios en el sistema.
  • Asegúrese de que los scripts no requieran la intervención del usuario cuando se ejecutan.
  • El script puede ejecutarse durante 90 minutos. Un valor superior a este provoca un error de aprovisionamiento de la extensión.
  • No coloque reinicios dentro del script. El reinicio provoca problemas con otras extensiones que se estén instalando y la extensión no continúa después del reinicio.
  • Si tiene un script que provoca un reinicio, antes de instalar aplicaciones y ejecutar scripts, programe el reinicio con un trabajo cron o herramientas como las extensiones DSC, Chef o Puppet.
  • No ejecute un script que provoque la detención o actualización del agente de Linux de Azure. Esto puede dejar la extensión en un estado de transición y provocar tiempo de espera.
  • La extensión ejecuta un script solo una vez. Si desea ejecutar un script en cada inicio, puede usar una imagen de cloud-init y un módulo Scripts Per Boot. Como alternativa, puede usar el script para crear una unidad de servicio de SystemD.
  • Solo puede tener aplicada una versión de una extensión a la máquina virtual. Para ejecutar un segundo script personalizado, actualice la extensión existente con una nueva configuración. Alternativamente, puede quitar la extensión de script personalizado y volver a aplicarla con el script actualizado.
  • Si desea programar cuándo se ejecuta un script, use la extensión para crear un trabajo cron.
  • Cuando el script se esté ejecutando, solo verá un estado de extensión en transición desde Azure Portal o la CLI. Si quiere recibir actualizaciones de estado más frecuentes de un script en ejecución, cree su propia solución.
  • La extensión de script personalizado no admite servidores proxy de forma nativa. Sin embargo, puede usar una herramienta de transferencia de archivos, como Curl, que admita servidores proxy dentro del script.
  • Tenga en cuenta las ubicaciones de directorio no predeterminadas en las que se puedan basar los scripts o comandos. Aplique lógica para controlarlas.

Esquema de extensión

La configuración de la extensión de script personalizado especifica aspectos como la ubicación del script y el comando que se ejecutará. Esta información se puede almacenar en archivos de configuración o se puede especificar en la línea de comandos o en una plantilla de Azure Resource Manager.

Los datos confidenciales se pueden almacenar en una configuración protegida, que se cifra y se descifra en la máquina virtual de destino. La configuración protegida es útil cuando el comando de ejecución incluye secretos tales como una contraseña. Este es un ejemplo:

{
  "name": "config-app",
  "type": "Extensions",
  "location": "[resourceGroup().location]",
  "apiVersion": "2019-03-01",
  "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": {
      "skipDos2Unix":false,
      "timestamp":123456789
    },
    "protectedSettings": {
       "commandToExecute": "<command-to-execute>",
       "script": "<base64-script-to-execute>",
       "storageAccountName": "<storage-account-name>",
       "storageAccountKey": "<storage-account-key>",
       "fileUris": ["https://.."],
       "managedIdentity" : "<managed-identity-identifier>"
    }
  }
}

Nota

La propiedad managedIdentityno debe usarse junto con la propiedad storageAccountName o storageAccountKey.

Valores de propiedad

Nombre Valor o ejemplo Tipo de datos
apiVersion 2019-03-01 date
publisher Microsoft.Azure.Extensions string
type CustomScript string
typeHandlerVersion 2.1 int
fileUris https://github.com/MyProject/Archive/MyPythonScript.py array
commandToExecute python MyPythonScript.py \<my-param1> string
script IyEvYmluL3NoCmVjaG8gIlVwZGF0aW5nIHBhY2thZ2VzIC4uLiIKYXB0IHVwZGF0ZQphcHQgdXBncmFkZSAteQo= string
skipDos2Unix false boolean
timestamp 123456789 Entero de 32 bits
storageAccountName examplestorageacct string
storageAccountKey TmJK/1N3AbAZ3q/+hOXoi/l73zOqsaxXDhqa9Y83/v5UpXQp2DQIBuv2Tifp60cE/OaHsJZmQZ7teQfczQj8hg== string
managedIdentity { }, { "clientId": "31b403aa-c364-4240-a7ff-d85fb6cd7232" } o { "objectId": "12dd289c-0583-46e5-b9b4-115d5c19ef4b" } Objeto JSON

Detalles del valor de propiedad

Propiedad Opcional u obligatoria Detalles
apiVersion No aplicable Puede encontrar la versión más actualizada de la API mediante el Explorador de recursos o el comando az provider list -o json de la CLI de Azure.
fileUris Opcionales Direcciones URL de los archivos que se descargarán.
commandToExecute Obligatorio si script no se ha establecido Script de punto de entrada que se ejecutará. Use esta propiedad en lugar de script si el comando contiene secretos tales como contraseñas.
script Obligatorio si commandToExecute no se ha establecido Un script codificado en Base64 y, opcionalmente, comprimido mediante gzip ejecutado por /bin/sh.
skipDos2Unix Opcionales Establezca este valor en false si desea omitir la conversión dos2unix de scripts o direcciones URL de archivo basadas en script.
timestamp Opcionales Cambie este valor solo para desencadenar una nueva ejecución del script. Cualquier valor entero es aceptable, siempre y cuando sea diferente del valor anterior.
storageAccountName Opcionales Nombre de la cuenta de almacenamiento. Si especifica credenciales de almacenamiento, todos los valores de fileUris deben ser direcciones URL de blobs de Azure.
storageAccountKey Opcionales Clave de acceso de la cuenta de almacenamiento.
managedIdentity Opcionales La identidad administrada para descargar archivos. Los valores válidos son clientId (opcional, cadena), que es el identificador de cliente de la identidad administrada y objectId (opcional, cadena), que es el identificador de objeto de la identidad administrada.

La configuración pública se envía en texto no cifrado a la máquina virtual donde se ejecuta el script. La configuración protegida se cifra con una clave que solo conocen Azure y la máquina virtual. La configuración se guarda en la máquina virtual a medida que se envía. Es decir, si la configuración se ha cifrado, se guarda cifrada en la máquina virtual. El certificado que se usa para descifrar los valores cifrados se almacena en la máquina virtual. El certificado también se usa para descifrar la configuración (si es necesario) en tiempo de ejecución.

El empleo de la configuración pública puede resultar útil para la depuración, pero se recomienda encarecidamente usar la configuración protegida.

Puede establecer los siguientes valores en la configuración pública o en la protegida. La extensión rechaza cualquier configuración en la que estos valores estén establecidos tanto en la configuración pública como en la protegida.

  • commandToExecute
  • script
  • fileUris

Propiedad: skipDos2Unix

La versión anterior de la extensión de script personalizado, Microsoft.OSTCExtensions.CustomScriptForLinux, convierte automáticamente los archivos DOS en archivos UNIX mediante la traducción de \r\n en \n. Esta traducción todavía existe y está habilitada de manera predeterminada. Esta conversión se aplica a todos los archivos que se descargan de fileUris o la configuración del script según cualquiera de los criterios siguientes:

  • La extensión es .sh, .txt, .py o .pl. La configuración del script siempre coincide con este criterio porque se supone que es una ejecución de script con /bin/sh. La configuración del script se guarda como script.sh en la máquina virtual.
  • El archivo empieza con #!.

El valor predeterminado es false, lo que significa que la conversión dos2unix se ejecuta. Puede omitir la conversión dos2unix si establece skipDos2Unix en true:

{
  "fileUris": ["<url>"],
  "commandToExecute": "<command-to-execute>",
  "skipDos2Unix": true
}

Propiedad: script

La extensión de script personalizado admite la ejecución de un script definido por el usuario. La configuración del script combina commandToExecute y fileUris en una sola configuración. En lugar de tener que configurar un archivo para descarga desde Azure Storage o GitHub gist, puede codificar el script como una configuración. Puede usar el script para reemplazar commandToExecute y fileUris.

Estos son algunos requisitos:

  • El script se debe codificar en Base64.
  • El script se puede comprimir mediante gzip.
  • Puede usar la configuración del script en configuraciones públicas o protegidas.
  • El tamaño máximo de los datos del parámetro del script es 256 KB. Si el script supera este tamaño, no se ejecuta.

Por ejemplo, el siguiente script se guarda en el archivo /script.sh/:

#!/bin/sh
echo "Creating directories ..."
mkdir /data
chown user:user /data
mkdir /appdata
chown user:user /appdata

Para construir la configuración de script de extensión de script personalizado correcta, tome la salida del siguiente comando:

cat script.sh | base64 -w0
{
  "script": "IyEvYmluL3NoCmVjaG8gIlVwZGF0aW5nIHBhY2thZ2VzIC4uLiIKYXB0IHVwZGF0ZQphcHQgdXBncmFkZSAteQo="
}

En la mayoría de los casos, el script se puede comprimir, de forma opcional, mediante gzip para reducir más el tamaño. La extensión de script personalizado detecta automáticamente el uso de la compresión gzip.

cat script | gzip -9 | base64 -w 0

La extensión de script personalizado usa el siguiente algoritmo para ejecutar un script:

  1. Asegúrese de que la longitud del valor del script no excede los 256 KB.
  2. Descodifique el valor del script en Base64.
  3. Intente ejecutar gunzip en el valor descodificado en Base64.
  4. Escriba el valor descodificado y opcionalmente descomprimido en el disco /var/lib/waagent/custom-script/#/script.sh.
  5. Ejecute el script mediante _/bin/sh -c /var/lib/waagent/custom-script/#/script.sh.

Propiedad: managedIdentity

Nota

Esta propiedad debe especificarse solo en la configuración protegida.

La extensión de script personalizado, versión 2.1 y posteriores, admite identidades administradas para descargar archivos de direcciones URL proporcionadas en la configuración fileUris. Este enfoque permite a la extensión de script personalizado acceder a blobs o contenedores privados de Azure Storage sin que el usuario tenga que enviar secretos como tokens de firma de acceso compartido (SAS) o claves de cuenta de almacenamiento.

Para usar esta característica, agregue una identidad asignada por el sistema o asignada por el usuario a la máquina virtual o al conjunto de escalado de máquinas virtuales donde se espera que se ejecute la extensión de script personalizado. Después, conceda a la identidad administrada acceso al contenedor o blob de Azure Storage.

Para usar la identidad asignada por el sistema en la máquina virtual o conjunto de escalado de máquinas virtuales de destino, establezca el campo managedidentity en un objeto JSON vacío.

{
  "fileUris": ["https://mystorage.blob.core.windows.net/privatecontainer/script1.sh"],
  "commandToExecute": "sh script1.sh",
  "managedIdentity" : {}
}

Para usar la identidad asignada por el usuario en la máquina virtual o el conjunto de escalado de máquinas virtuales de destino, configure el campo managedidentity con el id. de cliente o el id. de objeto de la identidad administrada.

{
  "fileUris": ["https://mystorage.blob.core.windows.net/privatecontainer/script1.sh"],
  "commandToExecute": "sh script1.sh",
  "managedIdentity" : { "clientId": "31b403aa-c364-4240-a7ff-d85fb6cd7232" }
}
{
  "fileUris": ["https://mystorage.blob.core.windows.net/privatecontainer/script1.sh"],
  "commandToExecute": "sh script1.sh",
  "managedIdentity" : { "objectId": "12dd289c-0583-46e5-b9b4-115d5c19ef4b" }
}

Nota

La propiedad managedIdentityno debe usarse junto con la propiedad storageAccountName o storageAccountKey.

Implementación de plantilla

Puede implementar extensiones de VM de Azure mediante plantillas de Azure Resource Manager. El esquema JSON detallado en la sección anterior se puede usar en una plantilla de Azure Resource Manager para ejecutar la extensión de script personalizado durante la implementación de la plantilla. Puede encontrar una plantilla de ejemplo que incluye la extensión de script personalizado en GitHub.

{
  "name": "config-app",
  "type": "extensions",
  "location": "[resourceGroup().location]",
  "apiVersion": "2019-03-01",
  "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": {
      },
    "protectedSettings": {
      "commandToExecute": "sh hello.sh <param2>",
      "fileUris": ["https://github.com/MyProject/Archive/hello.sh"
      ]
    }
  }
}

Nota

Los nombres de propiedad distinguen entre mayúsculas y minúsculas. Para evitar problemas de implementación, use los nombres como se muestran aquí.

Azure CLI

Cuando use la CLI de Azure para ejecutar la extensión de script personalizado, cree un archivo o archivos de configuración. Como mínimo, el archivo de configuración debe contener commandToExecute. El comando az vm extension set hace referencia al archivo de configuración:

az vm extension set \
  --resource-group myResourceGroup \
  --vm-name myVM --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --protected-settings ./script-config.json

Como alternativa, la configuración puede especificarse en el comando como una cadena con formato JSON. Este enfoque permite especificar la configuración durante la ejecución sin un archivo de configuración independiente.

az vm extension set \
  --resource-group exttest \
  --vm-name exttest \
  --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --protected-settings '{"fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"],"commandToExecute": "./config-music.sh"}'

Ejemplo: configuración pública con archivo de script

En este ejemplo se usa el siguiente archivo de script denominado script-config.json:

{
  "fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"],
  "commandToExecute": "./config-music.sh"
}
  1. Cree el archivo de script mediante el editor de texto que prefiera o mediante el siguiente comando de la CLI:

    cat <<EOF > script-config.json
    {
      "fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"],
      "commandToExecute": "./config-music.sh"
    }
    EOF
    
  2. Ejecute el comando siguiente:

    az vm extension set \
      --resource-group myResourceGroup \
      --vm-name myVM --name customScript \
      --publisher Microsoft.Azure.Extensions \
      --settings ./script-config.json
    

Ejemplo: configuración pública sin archivo de script

En este ejemplo se usa el siguiente contenido con formato JSON:

{
  "commandToExecute": "apt-get -y update && apt-get install -y apache2"
}

Ejecute el comando siguiente:

az vm extension set \
  --resource-group tim0329vmRG \
  --vm-name tim0329vm --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --settings '{"commandToExecute": "apt-get -y update && apt-get install -y apache2"}'

Ejemplo: archivos de configuración pública y protegida

Use un archivo de configuración pública para especificar el URI del archivo de script:

{
  "fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"]
}

Use un archivo de configuración protegida para especificar el comando que se ejecutará:

{
  "commandToExecute": "./config-music.sh"
}
  1. Cree el archivo de configuración pública mediante el editor de texto que prefiera o mediante el siguiente comando de la CLI:

    cat <<EOF > script-config.json
    {
      "fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"]
    }
    EOF
    
  2. Cree el archivo de configuración protegida mediante el editor de texto que prefiera o mediante el siguiente comando de la CLI:

    cat <<EOF > protected-config.json
    {
      "commandToExecute": "./config-music.sh"
    }
    EOF
    
  3. Ejecute el comando siguiente:

    az vm extension set \
      --resource-group myResourceGroup \
      --vm-name myVM \
      --name customScript \
      --publisher Microsoft.Azure.Extensions \
      --settings ./script-config.json \
      --protected-settings ./protected-config.json
    

Virtual Machine Scale Sets

Si implementa la extensión de script personalizado desde Azure Portal, no tiene control sobre la expiración del token de SAS para acceder al script en la cuenta de almacenamiento. La implementación inicial funciona, pero cuando expira el token de SAS de la cuenta de almacenamiento, se produce un error en cualquier operación de escalado posterior porque la extensión de script personalizado ya no puede acceder a la cuenta de almacenamiento.

Se recomienda usar PowerShell, la CLI de Azure o una plantilla de Azure Resource Manager al implementar la extensión de script personalizado en un conjunto de escalado de máquinas virtuales. De este modo, puede elegir usar una identidad administrada o tener control directo de la expiración del token de SAS para acceder al script en la cuenta de almacenamiento durante el tiempo que necesite.

Solución de problemas

Cuando la extensión de script personalizado se ejecuta, el script se crea o se descarga en un directorio similar al del ejemplo siguiente. La salida del comando se guarda también en este directorio, en los archivos stdout y stderr.

sudo ls -l /var/lib/waagent/custom-script/download/0/

Para solucionar problemas, primero compruebe el registro del agente de Linux y asegúrese de que se ejecutó la extensión:

sudo cat /var/log/waagent.log

Busque la ejecución de la extensión. Tiene un aspecto similar a lo siguiente:

2018/04/26 17:47:22.110231 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] [Enable] current handler state is: notinstalled
2018/04/26 17:47:22.306407 INFO Event: name=Microsoft.Azure.Extensions.customScript, op=Download, message=Download succeeded, duration=167
2018/04/26 17:47:22.339958 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] Initialize extension directory
2018/04/26 17:47:22.368293 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] Update settings file: 0.settings
2018/04/26 17:47:22.394482 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] Install extension [bin/custom-script-shim install]
2018/04/26 17:47:23.432774 INFO Event: name=Microsoft.Azure.Extensions.customScript, op=Install, message=Launch command succeeded: bin/custom-script-shim install, duration=1007
2018/04/26 17:47:23.476151 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] Enable extension [bin/custom-script-shim enable]
2018/04/26 17:47:24.516444 INFO Event: name=Microsoft.Azure.Extensions.customScript, op=Enable, message=Launch command succeeded: bin/custom-sc

En la salida anterior:

  • Enable indica que el comando empieza a ejecutarse.
  • Download se relaciona con la descarga del paquete de extensiones de script personalizado de Azure, no los archivos de script especificados en fileUris.

La extensión de script de Azure genera un registro, que se encuentra aquí:

sudo cat /var/log/azure/custom-script/handler.log

Busque la ejecución individual. Tiene un aspecto similar a lo siguiente:

time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event=start
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event=pre-check
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="comparing seqnum" path=mrseq
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="seqnum saved" path=mrseq
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="reading configuration"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="read configuration"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="validating json schema"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="json schema valid"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="parsing configuration json"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="parsed configuration json"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="validating configuration logically"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="validated configuration"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="creating output directory" path=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="created output directory"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 files=1
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 file=0 event="download start"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 file=0 event="download complete" output=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="executing command" output=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="executing protected commandToExecute" output=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="executed command" output=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event=enabled
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event=end

Aquí puede ver:

  • El comando enable que inicia este registro.
  • La configuración que se ha pasado a la extensión.
  • El archivo de descarga de la extensión y el resultado de esa acción.
  • El comando que se ejecuta y el resultado.

También puede recuperar el estado de ejecución de la extensión de script personalizado, incluidos los argumentos reales pasados como commandToExecute, mediante la CLI de Azure:

az vm extension list -g myResourceGroup --vm-name myVM

La salida tendrá un aspecto similar al siguiente:

[
  {
    "autoUpgradeMinorVersion": true,
    "forceUpdateTag": null,
    "id": "/subscriptions/subscriptionid/resourceGroups/rgname/providers/Microsoft.Compute/virtualMachines/vmname/extensions/customscript",
    "resourceGroup": "rgname",
    "settings": {
      "commandToExecute": "sh script.sh > ",
      "fileUris": [
        "https://catalogartifact.azureedge.net/publicartifacts/scripts/script.sh",
        "https://catalogartifact.azureedge.net/publicartifacts/scripts/script.sh"
      ]
    },
    "tags": null,
    "type": "Microsoft.Compute/virtualMachines/extensions",
    "typeHandlerVersion": "2.0",
    "virtualMachineExtensionType": "CustomScript"
  },
  {
    "autoUpgradeMinorVersion": true,
    "forceUpdateTag": null,
    "id": "/subscriptions/subscriptionid/resourceGroups/rgname/providers/Microsoft.Compute/virtualMachines/vmname/extensions/OmsAgentForLinux",
    "instanceView": null,
    "location": "eastus",
    "name": "OmsAgentForLinux",
    "protectedSettings": null,
    "provisioningState": "Succeeded",
    "publisher": "Microsoft.EnterpriseCloud.Monitoring",
    "resourceGroup": "rgname",
    "settings": {
      "workspaceId": "workspaceid"
    },
    "tags": null,
    "type": "Microsoft.Compute/virtualMachines/extensions",
    "typeHandlerVersion": "1.0",
    "virtualMachineExtensionType": "OmsAgentForLinux"
  }
]

Problemas de la sintaxis de la CLI de Azure

La CLI de Azure se puede ejecutar en varios entornos de shell, pero con ligeras variaciones de formato. Si tiene resultados inesperados con comandos de la CLI de Azure, consulte Uso correcto de la CLI de Azure.

Pasos siguientes

Para ver el código, los problemas actuales y las versiones, consulte custom-script-extension-linux.