Uso de la extensión de script personalizado de Azure versión 2 con máquinas virtuales LinuxUse the Azure Custom Script Extension Version 2 with Linux virtual machines

La extensión de script personalizado versión 2 descarga y ejecuta scripts en máquinas virtuales de Azure.The Custom Script Extension Version 2 downloads and runs scripts on Azure virtual machines. Esta extensión es útil para la configuración posterior a la implementación, la instalación de software o cualquier otra tarea de configuración o administración.This extension is useful for post-deployment configuration, software installation, or any other configuration/management task. 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.You can download scripts from Azure Storage or another accessible internet location, or you can provide them to the extension runtime.

La extensión de script personalizado se integra con las plantillas de Azure Resource Manager.The Custom Script Extension integrates with Azure Resource Manager templates. También puede ejecutarla mediante la CLI de Azure, PowerShell o la API REST de Azure Virtual Machines.You can also run it by using Azure CLI, PowerShell, or the Azure Virtual Machines REST API.

En este artículo se detalla 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.This article details how to use the Custom Script Extension from Azure CLI, and how to run the extension by using an Azure Resource Manager template. En este artículo se proporcionan también los pasos para la solución de problemas para los sistemas Linux.This article also provides troubleshooting steps for Linux systems.

Hay dos extensiones de script personalizado para Linux:There are two Linux Custom Script Extensions:

  • Versión 1: Microsoft.OSTCExtensions.CustomScriptForLinuxVersion 1 - Microsoft.OSTCExtensions.CustomScriptForLinux
  • Versión 2: Microsoft.Azure.Extensions.CustomScriptVersion 2 - Microsoft.Azure.Extensions.CustomScript

Cambie las implementaciones nuevas y existentes para que usen la nueva versión 2.Please switch new and existing deployments to use the new version 2 instead. La nueva versión está diseñada para que sea un sustituto directo.The new version is intended to be a drop-in replacement. Por lo tanto, la migración es tan sencilla como cambiar el nombre y la versión; no necesita cambiar la configuración de la extensión.Therefore, the migration is as easy as changing the name and version, you do not need to change your extension configuration.

Sistema operativoOperating System

La extensión de script personalizado para Linux se ejecutará en los sistemas operativos admitidos de la extensión. Para más información, vea este artículo.The Custom Script Extension for Linux will run on the extension supported extension OS's, for more information, see this article.

Ubicación del scriptScript Location

Puede emplear la extensión para usar las credenciales de Azure Blob Storage, a fin de tener acceso Azure Blob Storage.You can use the extension to use your Azure Blob storage credentials, to access Azure Blob storage. Como alternativa, la ubicación del script puede ser cualquier lugar, siempre y cuando la máquina virtual pueda enrutarse a ese punto de conexión, como GitHub, un servidor de archivos internos, etc.Alternatively, the script location can be any where, as long as the VM can route to that end point, such as GitHub, internal file server etc.

Conectividad de InternetInternet Connectivity

Si necesita descargar un script externamente, como GitHub o Azure Storage, deben abrirse puertos adicionales de firewall/grupo de seguridad de red.If you need to download a script externally such as GitHub or Azure Storage, then additional firewall/Network Security Group ports need to be opened. Por ejemplo, si el script se encuentra en Azure Storage, puede permitir el acceso mediante las etiquetas del servicio NSG de Azure para Storage.For example if your script is located in Azure Storage, you can allow access using Azure NSG Service Tags for Storage.

Si el script se encuentra en un servidor local, puede que aún necesite que haya abiertos puertos adicionales de firewall/grupo de seguridad de red.If your script is on a local server, then you may still need additional firewall/Network Security Group ports need to be opened.

Trucos y sugerenciasTips and Tricks

  • La mayor tasa de errores para esta extensión se debe a errores de sintaxis en el script. Compruebe que el script se ejecute sin errores y también establezca registros adicionales en el script para facilitar la búsqueda de dónde se produjo el error.The highest failure rate for this extension is due to syntax errors in the script, test the script runs without error, and also put in additional logging into the script to make it easier to find where it failed.
  • Escriba scripts que sean idempotentes, para que, si se ejecutan más de una vez por accidente, no provoquen cambios en el sistema.Write scripts that are idempotent, so if they get run again more than once accidentally, it will not cause system changes.
  • Asegúrese de que los scripts no requieran intervención del usuario cuando se ejecutan.Ensure the scripts do not require user input when they run.
  • Los scripts tienen permitido un plazo de 90 minutos para ejecutarse; todo lo que dure más provocará un error de aprovisionamiento de la extensión.There is 90 mins allowed for the script to run, anything longer will result in a failed provision of the extension.
  • No coloque reinicios dentro del script, ya que esto provocará problemas con otras extensiones que se estén instalando y, tras reiniciar el equipo, la extensión no continuará.Do not put reboots inside the script, this will cause issues with other extensions that are being installed, and post reboot, the extension will not continue after the restart.
  • No se recomienda ejecutar un script que provoque la detención o actualización del agente de máquina virtual.It is not recommended to run a script that will cause a stop or update of the VM Agent. Esto puede dejar la extensión a un estado de transición y dar lugar a un tiempo de espera.This might leave the extension in a Transitioning state and lead to a timeout.
  • Si tiene un script que provocará un reinicio, instale las aplicaciones y ejecute los scripts, etc. Debe programar el reinicio de un trabajo de Cron o usar herramientas como DSC, o extensiones de Chef o Puppet.If you have a script that will cause a reboot, then install applications and run scripts etc. You should schedule the reboot using a Cron job, or using tools such as DSC, or Chef, Puppet extensions.
  • La extensión solo ejecutará un script una vez, si desea ejecutar un script en cada inicio, puede usar cloud-init image y usar un módulo Scripts Per Boot.The extension will only run a script once, if you want to run a script on every boot, then you can use cloud-init image and use a Scripts Per Boot module. Como alternativa, puede usar el script para crear una unidad de servicio de SystemD.Alternatively, you can use the script to create a SystemD service unit.
  • Solo puede tener aplicada una versión de una extensión a la máquina virtual.You can only have one version of an extension applied to the VM. Para ejecutar un segundo script personalizado, debe quitar la extensión de script personalizado y volver a aplicarla con el script actualizado.In order to run a second custom script, you need to remove the custom script extension and reapply it again with the updated script.
  • Si desea programar cuándo se ejecutará un script, debe utilizar la extensión para crear un trabajo de Cron.If you want to schedule when a script will run, you should use the extension to create a Cron job.
  • Cuando el script se esté ejecutando, solo verá un estado de extensión "en transición" desde Azure Portal o la CLI.When the script is running, you will only see a 'transitioning' extension status from the Azure portal or CLI. Si quiere recibir actualizaciones de estado más frecuentes de un script en ejecución, debe crear su propia solución.If you want more frequent status updates of a running script, you will need to create your own solution.
  • La extensión de script personalizada no admite de forma nativa servidores proxy, pero puede usar una herramienta de transferencia de archivos que admita servidores proxy en el script, como Curl.Custom Script extension does not natively support proxy servers, however you can use a file transfer tool that supports proxy servers within your script, such as Curl.
  • Tenga en cuenta las ubicaciones de directorio no predeterminadas en las que se puedan basar los scripts o comandos y aplique lógica para controlarlas.Be aware of non default directory locations that your scripts or commands may rely on, have logic to handle this.
  • Al implementar un script personalizado en instancias de VMSS de producción, se recomienda implementarlo a través de la plantilla JSON y almacenar la cuenta de almacenamiento de scripts donde tenga el control sobre el token de SAS.When deploying custom script to production VMSS instances it is suggested to deploy via json template and store your script storage account where you have control over the SAS token.

Esquema de extensiónExtension schema

La configuración de la extensión de script personalizado especifica aspectos como la ubicación del script y el comando que se ejecutará.The Custom Script Extension configuration specifies things like script location and the command to be run. Esta configuració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.You can store this configuration in configuration files, specify it on the command line, or specify it in an Azure Resource Manager template.

Los datos confidenciales se pueden almacenar en una configuración protegida, que se cifra y se descifra solo dentro de la máquina virtual.You can store sensitive data in a protected configuration, which is encrypted and only decrypted inside the virtual machine. La configuración protegida es útil cuando el comando de ejecución incluye secretos tales como una contraseña.The protected configuration is useful when the execution command includes secrets such as a password.

Estos elementos se deben tratar como datos confidenciales y se deben especificar en la configuración protegida de las extensiones.These items should be treated as sensitive data and specified in the extensions protected setting configuration. Los datos de configuración protegida de la extensión de VM de Azure están cifrados y solo se descifran en la máquina virtual de destino.Azure VM extension protected setting data is encrypted, and only decrypted on the target virtual machine.

{
  "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 managedIdentity no debe usarse junto con las propiedades storageAccountName o storageAccountKeymanagedIdentity property must not be used in conjunction with storageAccountName or storageAccountKey properties

Valores de propiedadProperty values

NombreName Valor / ejemploValue / Example Tipo de datosData Type
apiVersionapiVersion 2019-03-012019-03-01 datedate
publisherpublisher Microsoft.Compute.ExtensionsMicrosoft.Compute.Extensions stringstring
typetype CustomScriptCustomScript stringstring
typeHandlerVersiontypeHandlerVersion 2.12.1 intint
fileUris (p. ej.)fileUris (e.g) https://github.com/MyProject/Archive/MyPythonScript.py arrayarray
commandToExecute (p. ej.)commandToExecute (e.g) python MyPythonScript.py <my-param1>python MyPythonScript.py <my-param1> stringstring
scriptscript IyEvYmluL3NoCmVjaG8gIlVwZGF0aW5nIHBhY2thZ2VzIC4uLiIKYXB0IHVwZGF0ZQphcHQgdXBncmFkZSAteQo=IyEvYmluL3NoCmVjaG8gIlVwZGF0aW5nIHBhY2thZ2VzIC4uLiIKYXB0IHVwZGF0ZQphcHQgdXBncmFkZSAteQo= stringstring
skipDos2Unix (p. ej.)skipDos2Unix (e.g) falsefalse booleanboolean
timestamp (p. ej.)timestamp (e.g) 123456789123456789 Entero de 32 bits32-bit integer
storageAccountName (p. ej.)storageAccountName (e.g) examplestorageacctexamplestorageacct stringstring
storageAccountKey (p. ej.)storageAccountKey (e.g) TmJK/1N3AbAZ3q/+hOXoi/l73zOqsaxXDhqa9Y83/v5UpXQp2DQIBuv2Tifp60cE/OaHsJZmQZ7teQfczQj8hg==TmJK/1N3AbAZ3q/+hOXoi/l73zOqsaxXDhqa9Y83/v5UpXQp2DQIBuv2Tifp60cE/OaHsJZmQZ7teQfczQj8hg== stringstring
managedIdentity (p. ej.)managedIdentity (e.g) { } o {"clientId": "31b403aa-C364-4240-a7ff-d85fb6cd7232"} o {"objectId": "12dd289c-0583-46e5-b9b4-115d5c19ef4b" }{ } or { "clientId": "31b403aa-c364-4240-a7ff-d85fb6cd7232" } or { "objectId": "12dd289c-0583-46e5-b9b4-115d5c19ef4b" } json objectjson object

Detalles del valor de propiedadProperty value details

  • apiVersion: La apiVersion más reciente se pueden encontrar mediante el Explorador de recursos o desde la CLI de Azure mediante el siguiente comando az provider list -o json.apiVersion: The most up to date apiVersion can be found using Resource Explorer or from Azure CLI using the following command az provider list -o json
  • skipDos2Unix: (opcional, booleano) omita la conversión dos2unix del script y las direcciones URL del archivo basado en script.skipDos2Unix: (optional, boolean) skip dos2unix conversion of script-based file URLs or script.
  • timestamp (opcional, entero de 32 bits) use este campo solo para desencadenar una nueva ejecución del script; para ello, cambie el valor de este campo.timestamp (optional, 32-bit integer) use this field only to trigger a re-run of the script by changing value of this field. Se acepta cualquier valor entero; solo debe ser distinto del valor anterior.Any integer value is acceptable; it must only be different than the previous value.
  • commandToExecute: (obligatorio si hay script establecido, cadena) script de punto de entrada que se va a ejecutar.commandToExecute: (required if script not set, string) the entry point script to execute. Use este campo si el comando contiene secretos tales como contraseñas.Use this field instead if your command contains secrets such as passwords.
  • script: (obligatorio si no hay commandToExecute establecido, cadena) script codificado en Base64 (y opcionalmente como archivo) ejecutado mediante /bin/sh.script: (required if commandToExecute not set, string)a base64 encoded (and optionally gzip'ed) script executed by /bin/sh.
  • fileUris (opcional, matriz de cadenas): direcciones URL de los archivos que se van a descargar.fileUris: (optional, string array) the URLs for file(s) to be downloaded.
  • storageAccountName (opcional, cadena): nombre de la cuenta de almacenamiento.storageAccountName: (optional, string) the name of storage account. Si especifica credenciales de almacenamiento, todos los valores de fileUris deben ser direcciones URL de blobs de Azure.If you specify storage credentials, all fileUris must be URLs for Azure Blobs.
  • storageAccountKey (opcional, cadena): clave de acceso de la cuenta de almacenamiento.storageAccountKey: (optional, string) the access key of storage account
  • managedIdentity: (opcional, objeto JSON) la identidad administrada para descargar archivos.managedIdentity: (optional, json object) the managed identity for downloading file(s)
    • clientId: (opcional, cadena) el id. de cliente de la identidad administrada.clientId: (optional, string) the client ID of the managed identity
    • objectId: (opcional, cadena) el id. de objeto de la identidad administrada.objectId: (optional, string) the object ID of the managed identity

Los valores siguientes se pueden establecer en la configuración pública o protegida. La extensión rechazará una configuración si los valores siguientes están establecidos en la configuración tanto pública como protegida.The following values can be set in either public or protected settings, the extension will reject any configuration where the values below are set in both public and protected settings.

  • commandToExecute
  • script
  • fileUris

Usar la configuración pública puede resultar útil para la depuración, pero se recomienda encarecidamente usar la configuración protegida.Using public settings maybe useful for debugging, but it is strongly recommended that you use protected settings.

La configuración pública se envía en texto no cifrado a la máquina virtual donde se ejecutará el script.Public settings are sent in clear text to the VM where the script will be executed. La configuración protegida se cifra con una clave que solo conocen Azure y la máquina virtual.Protected settings are encrypted using a key known only to the Azure and the VM. La configuración se guarda en la máquina virtual tal cual se envió; es decir, si la configuración estaba cifrada, se guarda cifrada en la máquina virtual.The settings are saved to the VM as they were sent, i.e. if the settings were encrypted they are saved encrypted on the VM. El certificado usado para descifrar los valores cifrados se almacena en la máquina virtual y se usa para descifrar la configuración (si es necesario) en tiempo de ejecución.The certificate used to decrypt the encrypted values is stored on the VM, and used to decrypt settings (if necessary) at runtime.

Propiedad: skipDos2UnixProperty: skipDos2Unix

El valor predeterminado es false, lo que significa que la conversión dos2unix se ejecuta.The default value is false, which means dos2unix conversion is executed.

La versión anterior de CustomScript, Microsoft.OSTCExtensions.CustomScriptForLinux, convertiría automáticamente los archivos DOS en archivos UNIX mediante la traducción de \r\n en \n.The previous version of CustomScript, Microsoft.OSTCExtensions.CustomScriptForLinux, would automatically convert DOS files to UNIX files by translating \r\n to \n. Esta traducción todavía existe y está habilitada de manera predeterminada.This translation still exists, and is on by default. 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.This conversion is applied to all files downloaded from fileUris or the script setting based on any of the following criteria.

  • Si la extensión es una de .sh, .txt, .py o .pl, se convertirá.If the extension is one of .sh, .txt, .py, or .pl it will be converted. La configuración del script siempre coincidirá con este criterio porque se supone que es un script que se ejecuta con /bin/sh y se guarda como script.sh en la máquina virtual.The script setting will always match this criteria because it is assumed to be a script executed with /bin/sh, and is saved as script.sh on the VM.
  • Si el archivo empieza con #!.If the file starts with #!.

Se puede omitir la conversión dos2unix si skipDos2Unix se establece en true.The dos2unix conversion can be skipped by setting the skipDos2Unix to true.

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

Propiedad: scriptProperty: script

CustomScript admite la ejecución de un script definido por el usuario.CustomScript supports execution of a user-defined script. La configuración del script para combinar commandToExecute y fileUris en una sola configuración.The script settings to combine commandToExecute and fileUris into a single setting. En lugar de tener que configurar un archivo para descarga desde Azure Storage o GitHub GiST, simplemente codifique el script como una configuración.Instead of the having to setup a file for download from Azure storage or GitHub gist, you can simply encode the script as a setting. El script se puede usar para reemplazar commandToExecute y fileUris.Script can be used to replaced commandToExecute and fileUris.

El script se debe codificar en Base64.The script must be base64 encoded. El script se puede comprimir mediante gzip.The script can optionally be gzip'ed. La configuración del script se puede usar en configuraciones públicas o protegidas.The script setting can be used in public or protected settings. El tamaño máximo de los datos del parámetro del script es 256 KB.The maximum size of the script parameter's data is 256 KB. No se ejecutará el script si excede este tamaño.If the script exceeds this size it will not be executed.

Por ejemplo, supongamos que el script siguiente se guardó en el archivo /script.sh/.For example, given the following script saved to the file /script.sh/.

#!/bin/sh
echo "Updating packages ..."
apt update
apt upgrade -y

La configuración correcta del script CustomScript se construiría tomando la salida del comando siguiente.The correct CustomScript script setting would be constructed by taking the output of the following command.

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

De manera opcional, el script se puede comprimir mediante gzip para reducir más el tamaño (en la mayoría de los casos). (CustomScript detecta automáticamente el uso de la compresión gzip).(CustomScript auto-detects the use of gzip compression.)

cat script | gzip -9 | base64 -w 0

CustomScript usa el algoritmo siguiente para ejecutar un script.CustomScript uses the following algorithm to execute a script.

  1. Garantizar que la longitud del valor del script no excede los 256 KB.assert the length of the script's value does not exceed 256 KB.
  2. Descodificar el valor del script en Base64.base64 decode the script's value
  3. Intente ejecutar gunzip en el valor decodificado en Base64.attempt to gunzip the base64 decoded value
  4. Escriba el valor descodificado (y opcionalmente descomprimido) en el disco (/var/lib/waagent/custom-script/#/script.sh)write the decoded (and optionally decompressed) value to disk (/var/lib/waagent/custom-script/#/script.sh)
  5. Ejecute el script con _/bin/sh -c /var/lib/waagent/custom-script/#/script.sh.execute the script using _/bin/sh -c /var/lib/waagent/custom-script/#/script.sh.

Propiedad: managedIdentityProperty: managedIdentity

Nota

Esta propiedad debe especificarse solo en la configuración protegida.This property must be specified in protected settings only.

CustomScript (versión 2.1 en adelante) admite la identidad administrada para descargar archivos de las direcciones URL proporcionadas en el valor "fileUris".CustomScript (version 2.1 onwards) supports managed identity for downloading file(s) from URLs provided in the "fileUris" setting. Permite a CustomScript acceder a blobs o contenedores privados de Azure Storage sin que el usuario tenga que enviar secretos como tokens de SAS o claves de cuenta de almacenamiento.It allows CustomScript to access Azure Storage private blobs or containers without the user having to pass secrets like SAS tokens or storage account keys.

Para usar esta característica, el usuario debe agregar una identidad asignada por el sistema oasignada por el usuario a la máquina virtual o VMSS donde se espera que se ejecute CustomScript y conceder a la identidad administrada acceso al contenedor de Azure Storage o al blob.To use this feature, the user must add a system-assigned or user-assigned identity to the VM or VMSS where CustomScript is expected to run, and grant the managed identity access to the Azure Storage container or blob.

Para usar la identidad asignada por el sistema en la máquina virtual/VMSS de destino, establezca el campo "managedidentity" a un objeto JSON vacío.To use the system-assigned identity on the target VM/VMSS, set "managedidentity" field to an empty json object.

Ejemplo:Example:

{
  "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/VMSS de destino, configure el campo "managedidentity" con el identificador de cliente o el identificador de objeto de la identidad administrada.To use the user-assigned identity on the target VM/VMSS, configure "managedidentity" field with the client ID or the object ID of the managed identity.

Ejemplos:Examples:

{
  "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 managedIdentity no debe usarse junto con las propiedades storageAccountName o storageAccountKeymanagedIdentity property must not be used in conjunction with storageAccountName or storageAccountKey properties

Implementación de plantillaTemplate deployment

Las extensiones de VM de Azure pueden implementarse con plantillas de Azure Resource Manager.Azure VM extensions can be deployed with Azure Resource Manager templates. 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 una plantilla de Azure Resource Manager.The JSON schema detailed in the previous section can be used in an Azure Resource Manager template to run the Custom Script Extension during an Azure Resource Manager template deployment. Aquí (GitHub) puede encontrar una plantilla de ejemplo que incluye la extensión de script personalizado.A sample template that includes the Custom Script Extension can be found here, 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.These property names are case-sensitive. Para evitar problemas de implementación, use los nombres como se muestran aquí.To avoid deployment problems, use the names as shown here.

Azure CLIAzure CLI

Cuando se usa la CLI de Azure para ejecutar la extensión de script personalizado, cree un archivo o archivos de configuración.When you're using Azure CLI to run the Custom Script Extension, create a configuration file or files. Como mínimo, debe tener "commandToExecute".At a minimum, you must have 'commandToExecute'.

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

Opcionalmente, la configuración puede especificarse en el comando como una cadena con formato JSON.Optionally, you can specify the settings in the command as a JSON formatted string. Esto permite especificar la configuración durante la ejecución sin un archivo de configuración independiente.This allows the configuration to be specified during execution and without a separate configuration file.

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

Ejemplos de la CLI de AzureAzure CLI examples

Configuración pública con archivo de scriptPublic configuration with script file

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

Comando de la CLI de Azure:Azure CLI command:

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

Configuración pública sin archivo de scriptPublic configuration with no script file

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

Comando de la CLI de Azure:Azure CLI command:

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

Archivos de configuración pública y protegidaPublic and protected configuration files

Use un archivo de configuración pública para especificar el URI del archivo de script.You use a public configuration file to specify the script file URI. Use un archivo de configuración protegida para especificar el comando que se ejecutará.You use a protected configuration file to specify the command to be run.

Archivo de configuración pública:Public configuration file:

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

Archivo de configuración protegida:Protected configuration file:

{
  "commandToExecute": "./config-music.sh <param1>"
}

Comando de la CLI de Azure:Azure CLI command:

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

Solución de problemasTroubleshooting

Cuando la extensión de script personalizado se ejecuta, el script se crea o se descarga en un directorio similar al del ejemplo siguiente.When the Custom Script Extension runs, the script is created or downloaded into a directory that's similar to the following example. La salida del comando se guarda también en este directorio, en los archivos stdout y stderr.The command output is also saved into this directory in stdout and stderr files.

/var/lib/waagent/custom-script/download/0/

Para solucionar problemas, primero compruebe el registro del agente de Linux, asegúrese de que se ejecutó la extensión, consulte:To troubleshoot, first check the Linux Agent Log, ensure the extension ran, check:

/var/log/waagent.log 

Debe buscar la ejecución de la extensión, tendrá un aspecto parecido al siguiente:You should look for the extension execution, it will look something like:

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

Algunos puntos a tener en cuenta:Some points to note:

  1. Enable es cuando el comando empieza a ejecutarse.Enable is when the command starts running.
  2. Download se relaciona con la descarga del paquete de extensiones de CustomScript de Azure, no los archivos de script especificados en fileUris.Download relates to the downloading of the CustomScript extension package from Azure, not the script files specified in fileUris.

La extensión de script de Azure genera un registro, que se encuentra aquí:The Azure Script Extension produces a log, which you can find here:

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

Debe buscar la ejecución individual, que tendrá un aspecto parecido al siguiente:You should look for the individual execution, it will look something like:

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:Here you can see:

  • El comando Enable que se inicia es este registro.The Enable command starting is this log
  • La configuración que se pasó a la extensión.The settings passed to the extension
  • El archivo de descarga de la extensión y el resultado.The extension downloading file and the result of that.
  • El comando que se ejecuta y el resultado.The command being run and the result.

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:You can also retrieve the execution state of the Custom Script Extension including the actual arguments passed as the commandToExecute by using Azure CLI:

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

La salida tendrá un aspecto similar al siguiente:The output looks like the following text:

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

Pasos siguientesNext steps

Para ver el código, los problemas actuales y las versiones, consulte el repositorio Linux de extensiones de custom-script.To see the code, current issues and versions, see custom-script-extension-linux repo.