Usar a Versão 2 da Extensão de Script Personalizado do Azure com máquinas virtuais do Linux

Cuidado

Este artigo faz referência ao CentOS, uma distribuição do Linux que está se aproximando do status de EOL (fim da vida útil). Considere seu uso e planeje adequadamente. Para obter mais informações, veja as Diretrizes sobre fim da vida útil do CentOS.

A Versão 2 da Extensão de Script Personalizado faz o download e executa scripts em VMs (máquinas virtuais) do Azure. Use essa extensão para a configuração pós-implantação, instalação de software ou qualquer outra tarefa de configuração ou gerenciamento. Você pode fazer o download de scripts a partir do Armazenamento do Microsoft Azure ou outro local acessível da internet, ou você pode fornecê-los para o runtime da extensão.

A extensão de Script personalizado se integra com os modelos do Azure Resource Manager. Você também pode executá-lo usando a CLI do Azure, o Azure PowerShell ou a API REST das Máquinas Virtuais do Azure.

Este artigo descreve como usar a Extensão de Script Personalizado da CLI do Azure e como executar a extensão usando um modelo do Azure Resource Manager. Este artigo também fornece as etapas de solução de problemas para os sistemas do Linux.

Há duas versões da extensão de script personalizado:

  • Versão 1: Microsoft.OSTCExtensions.CustomScriptForLinux
  • Versão 2: Microsoft.Azure.Extensions.CustomScript

Usar a Versão 2 para implantações novas e existentes. A nova versão é uma substituição rápida. Para fazer a migração, basta alterar o nome e a versão. Você não precisa alterar a configuração da extensão.

Pré-requisitos

Distribuições Linux compatíveis

Distribuição x64 ARM64
Alma Linux 9.x+ 9.x+
CentOS 7.x+, 8.x+ 7.x+
Debian Mais de 10 11.x+
Flatcar Linux 3374.2.x+ 3374.2.x+
Azure Linux 2. x 2. x
openSUSE 12.3+ Sem suporte
Oracle Linux 6.4+, 7.x+, 8.x+ Sem suporte
Red Hat Enterprise Linux 6.7+, 7.x+, 8.x+, 9.x+ 8.6+, 9.x+
Rocky Linux 9.x+ 9.x+
SLES 12.x+, 15.x+ 15.x SP4+
Ubuntu 18.04+, 20.04+, 22.04+ 20.04+, 22.04+

Local do script

Você pode configurar a extensão para usar suas credenciais do Armazenamento de Blobs do Azure para acessar esse armazenamento. O local do script pode ser qualquer um, desde que a VM possa rotear para esse ponto de extremidade, como, por exemplo, o GitHub ou um servidor de arquivos interno.

Conectividade com a Internet

Para baixar um script externamente, como, por exemplo, do GitHub ou do Armazenamento do Azure, você precisará abrir outras portas de firewall ou do grupo de segurança de rede (NSG). Por exemplo, se o script estiver localizado no Armazenamento do Azure, você poderá permitir o acesso usando marcas de serviço para armazenamento do NSG do Azure.

Se o seu script estiver em um servidor local, talvez você continue precisando abrir outras portas de firewall ou de NSG.

Dicas

  • A taxa de falha mais alta para essa extensão ocorre devido a erros de sintaxe no script. Verifique se o script está sendo executado sem erros. Coloque mais registros em log no script para facilitar a detecção de falhas.
  • Escreva scripts idempotentes, de modo que executá-los mais de uma vez inadvertidamente não cause alterações no sistema.
  • Verifique se os scripts não exigem entrada de usuário quando são executados.
  • O script tem permissão para ser executado em 90 minutos. Qualquer coisa além disso resultará em falha no provisionamento da extensão.
  • Não coloque reinicializações dentro do script. A reinicialização causa problemas com outras extensões que estão sendo instaladas e a extensão não continua após a reinicialização.
  • Se você tiver um script que cause uma reinicialização antes de instalar aplicativos e executar scripts, agende a reinicialização usando um trabalho cron ou usando ferramentas como as extensões DSC, Chef ou Puppet.
  • Não executar um script que causa uma parada ou atualização do Agente Linux do Azure. Isso poderá deixar a extensão em um estado de transição e fazer com que o tempo limite seja excedido.
  • A extensão executa um script apenas uma vez. Se quiser executar um script a cada inicialização, use uma imagem cloud-init e um módulo Scripts por Inicialização. Como alternativa, você pode usar o script para criar uma unidade de serviço systemd.
  • Você só pode ter uma versão de uma extensão aplicada à VM. Para executar um segundo script personalizado, atualize a extensão existente com uma nova configuração. Como alternativa, você pode remover a extensão de script personalizado e reaplicá-la com o script atualizado.
  • Se você quiser agendar a execução de um script, use a extensão para criar um trabalho cron.
  • Quando o script está em execução, você só vê um status da extensão em transição do portal do Azure ou da CLI. Se quiser atualizações de status mais frequentes para um script em execução, crie sua própria solução.
  • A extensão de script personalizado não dá suporte nativo a servidores proxy. No entanto, você pode usar uma ferramenta de transferência de arquivos, como Curl, que ofereça suporte a servidores proxy no seu script.
  • Esteja ciente dos locais de diretório não padrão dos quais seus scripts ou comandos poderão depender. Tenha uma lógica para lidar com essa situação.

Esquema de extensão

A configuração de extensão de script personalizado especifica itens como localização de script e o comando a ser executado. Você pode armazenar essas informações em arquivos de configuração, especificá-la na linha de comando ou especificá-la em um modelo do Azure Resource Manager.

Você pode armazenar dados confidenciais em uma configuração protegida, criptografada e descriptografada apenas na VM de destino. A configuração protegida é útil quando o comando de execução inclui segredos, como uma senha. Veja um exemplo:

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

Observação

A propriedade managedIdentitynão pode ser usada em conjunto com a propriedade storageAccountName ou storageAccountKey.

Valores de propriedade

Nome Valor ou exemplo Tipo de dados
apiVersion 2019-03-01 date
publicador 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= cadeia de caracteres
skipDos2Unix false booleano
timestamp 123456789 Inteiro de 32 bits
storageAccountName examplestorageacct string
storageAccountKey TmJK/1N3AbAZ3q/+hOXoi/l73zOqsaxXDhqa9Y83/v5UpXQp2DQIBuv2Tifp60cE/OaHsJZmQZ7teQfczQj8hg== Cadeia de caracteres
managedIdentity { } ou { "clientId": "31b403aa-c364-4240-a7ff-d85fb6cd7232" } ou { "objectId": "12dd289c-0583-46e5-b9b4-115d5c19ef4b" } Objeto JSON

Detalhes de valor de propriedade

Propriedade Opcional ou obrigatório Detalhes
apiVersion Não aplicável Você pode encontrar a versão mais atualizada da API usando o Gerenciador de Recursos ou o comando az provider list -o json na CLI do Azure.
fileUris Opcional URLs para arquivos a serem baixados.
commandToExecute Obrigatório se script não estiver definido O script de ponto de entrada a ser executado. Use esta propriedade em vez de script se o comando tiver segredos, como senhas.
Script Obrigatório se commandToExecute não estiver definido Um script codificado em Base64 e opcionalmente compactado em gzip executado por /bin/sh.
skipDos2Unix Opcional Defina esse valor como false se você quiser ignorar a conversão dos2unix de URLs ou scripts de arquivo baseados em script.
timestamp Opcional Altere esse valor apenas para disparar uma nova repetição do script. Qualquer valor inteiro é aceitável, desde que seja diferente do valor anterior.
storageAccountName Opcional O nome da conta de armazenamento. Se você especificar credenciais de armazenamento, todos os valores de fileUris precisarão ser URLs de blobs do Azure.
storageAccountKey Opcional A chave de acesso da conta de armazenamento.
managedIdentity Opcional A identidade gerenciada para baixar arquivos. Os valores são clientId (opcional, cadeia de caracteres), que é a ID do cliente de identidade gerenciada, e objectId (opcional, cadeia de caracteres), que é a ID do objeto de identidade gerenciada.

As configurações públicas são enviadas em texto não criptografado para a VM em que o script será executado. As configurações protegidas são criptografadas por meio de uma chave conhecida apenas pelo Azure e pela VM. As configurações são salvas na VM conforme são enviadas. Ou seja, se as configurações forem criptografadas, elas serão salvas criptografadas na VM. O certificado que é usado para descriptografar os valores criptografados é armazenado na VM. O certificado também é usado para descriptografar as configurações no runtime, se necessário.

O uso de configurações públicas pode ser útil para depuração, mas recomendamos enfaticamente que você use as configurações protegidas.

Você pode definir os seguintes valores em configurações públicas ou protegidas. A extensão rejeita qualquer configuração em que esses valores estejam definidos em ambas as configurações, pública e protegida.

  • commandToExecute
  • script
  • fileUris

Propriedade: skipDos2Unix

A versão anterior da Extensão de Script Personalizado, Microsoft.OSTCExtensions.CustomScriptForLinux, converte automaticamente arquivos DOS em arquivos UNIX, traduzindo \r\n em \n. Essa tradução ainda existe e fica ativada por padrão. A conversão é aplicada a todos os arquivos baixados do fileUris ou à configuração de script baseada em qualquer um dos seguintes critérios:

  • A extensão é .sh, .txt, .py ou .pl. A configuração de script sempre corresponde a esse critério porque se presume que seja uma execução de script com /bin/sh. A configuração de script é salva como script.sh na VM.
  • O arquivo começa com #!.

O valor padrão é false, o que significa que a conversão de dos2unix foi executada. Você pode ignorar a conversão de dos2unix definindo skipDos2Unix como true:

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

Propriedade: script

A Extensão de Script Personalizado dá suporte à execução de um script definido pelo usuário. As configurações de script combinam commandToExecute e fileUris em uma só configuração. Em vez de ter que configurar um arquivo para download do Armazenamento do Microsoft Azure ou de um gist do GitHub, você pode codificar o script como uma configuração. Você pode usar o script para substituir commandToExecute e fileUris.

Estes são alguns requisitos:

  • O script precisa ser codificado em Base64.
  • O script pode, opcionalmente, ser compactado com Gzip.
  • Você pode usar a configuração de script em configurações públicas ou protegidas.
  • O tamanho máximo dos dados do parâmetro do script é 256 KB. Se o script exceder esse tamanho, ele não será executado.

Por exemplo, o seguinte script é salvo no arquivo /script.sh/:

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

Você construiria a configuração correta do script da Extensão de Script Personalizado usando a saída do seguinte comando:

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

Na maioria dos casos, o script pode ser compactado com GZip para reduzir ainda mais o tamanho. A Extensão de Script Personalizado detecta automaticamente o uso da compactação com GZip.

cat script | gzip -9 | base64 -w 0

A Extensão de Script Personalizado usa o seguinte algoritmo para executar um script:

  1. Assegure que o tamanho do valor do script não exceda 256 KB.
  2. Decodifique o valor do script com Base64.
  3. Tente descompactar com gunzip o valor decodificado com Base64.
  4. Grave o valor decodificado e opcionalmente descompactado no disco: /var/lib/waagent/custom-script/#/script.sh.
  5. Execute o script usando _/bin/sh -c /var/lib/waagent/custom-script/#/script.sh.

Propriedade: managedIdentity

Observação

Essa propriedade precisa ser especificada somente em configurações protegidas.

A Extensão de Script Personalizado, versão 2.1 e posterior, suporta identidades gerenciadas para baixar arquivos das URLs fornecidas na configuração fileUris. Essa abordagem permite que a Extensão de Script Personalizado acesse os blobs ou contêineres privados do Armazenamento do Microsoft Azure sem que o usuário precise passar segredos, como tokens de assinatura de acesso compartilhado (SAS) ou chaves de conta de armazenamento.

Para usar esse recurso, adicione uma identidade atribuída pelo sistema ou atribuída pelo usuário à VM ou ao Conjunto de Dimensionamento de Máquinas Virtuais onde se espera que a Extensão de Script Personalizado seja executada. A seguir, conceda o acesso de identidade gerenciada ao contêiner ou blob de Armazenamento do Azure.

Para usar a identidade atribuída pelo sistema na VM ou no Conjunto de Dimensionamento de Máquinas Virtuais de destino, defina managedidentity como um objeto JSON vazio.

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

Para usar a identidade atribuída pelo usuário na VM ou no Conjunto de Dimensionamento de Máquinas Virtuais de destino, configure managedidentity com a ID de cliente ou a ID de objeto da identidade gerenciada.

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

Observação

A propriedade managedIdentitynão pode ser usada em conjunto com a propriedade storageAccountName ou storageAccountKey.

Implantação de modelo

É possível implantar extensões de VM do Azure com os modelos do Azure Resource Manager. O esquema JSON detalhado na seção anterior pode ser usado em um modelo do Azure Resource Manager para executar a Extensão de Script Personalizado durante a implantação do modelo. Você pode encontrar um modelo de exemplo que inclui a Extensão de Script Personalizado no 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"
      ]
    }
  }
}

Observação

Esses nomes de propriedade diferenciam maiúsculas de minúsculas. Para evitar problemas de implantação, use os nomes conforme mostrado aqui.

CLI do Azure

Ao usar a CLI do Azure para executar a Extensão de Script Personalizado, crie um ou mais arquivos de configuração. No mínimo, o arquivo de configuração deve conter commandToExecute. O comando az vm extension set se refere ao arquivo de configuração:

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

Como alternativa, você pode especificar as configurações no comando como uma cadeia de caracteres formatada em JSON. Essa abordagem permite que a configuração seja especificada durante a execução e sem um arquivo de configuração separado.

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

Exemplo: configuração pública com arquivo de script

Esse exemplo usa o seguinte arquivo de script chamado 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. Crie o arquivo de script usando um editor de texto de sua escolha ou o seguinte comando da 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. Execute o comando a seguir:

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

Exemplo: configuração pública sem arquivo de script

Este exemplo utiliza o seguinte conteúdo formatado em JSON:

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

Execute o comando a seguir:

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

Exemplo: arquivos de configuração públicos e protegidos

Use um arquivo de configuração público para especificar o URI do arquivo de script:

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

Use um arquivo de configuração protegido para especificar o comando a ser executado:

{
  "commandToExecute": "./config-music.sh"
}
  1. Crie o arquivo de configuração público usando um editor de texto de sua escolha ou usando o seguinte comando da 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. Crie o arquivo de configuração protegido usando um editor de texto de sua escolha ou o seguinte comando da CLI:

    cat <<EOF > protected-config.json
    {
      "commandToExecute": "./config-music.sh"
    }
    EOF
    
  3. Execute o comando a seguir:

    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
    

Conjuntos de Dimensionamento de Máquinas Virtuais

Se você implantar a Extensão de Script Personalizado a partir do portal do Azure, não terá controle sobre a expiração do token SAS para acessar o script na sua conta de armazenamento. A implantação inicial funciona, mas quando o token SAS da conta de armazenamento expirar, as próximas operações de dimensionamento irão falhar porque a Extensão de Script Personalizado não poderá mais acessar a conta de armazenamento.

Recomendamos que você use o PowerShell, a CLI do Azure ou um modelo do Azure Resource Manager ao implantar a Extensão de Script Personalizado em um Conjunto de Dimensionamento de Máquinas Virtuais. Assim, você pode usar uma identidade gerenciada ou ter controle direto da expiração do token SAS para acessar o script na conta de armazenamento durante o tempo que for necessário.

Solução de problemas

Quando a extensão de script personalizado é executada, o script é criado ou baixado em um diretório semelhante ao exemplo a seguir. A saída do comando também é salva nesse diretório nos arquivos stdout e stderr.

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

Para solucionar problemas, primeiro verifique o log do Agente Linux e verifique se a extensão foi executada:

sudo cat /var/log/waagent.log

Procure a execução da extensão. Parece algo como:

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

Na saída anterior:

  • Enable é quando o comando começa a ser executado.
  • Download está relacionado ao download do pacote da Extensão de Script Personalizado do Azure, não aos arquivos de script especificados em fileUris.

A extensão de script do Azure produz um log, que pode ser encontrado aqui:

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

Procure a execução individual. Parece algo como:

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

Aqui, você pode ver:

  • O comando enable que inicia esse log.
  • As configurações passadas para a extensão.
  • A extensão que está baixando o arquivo e o resultado dessa ação.
  • O comando em execução e o resultado.

Você também pode recuperar o estado de execução da Extensão de Script Personalizado, incluindo os argumentos reais transmitidos como commandToExecute, usando a CLI do Azure:

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

A saída se parece com o seguinte texto:

[
  {
    "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 sintaxe da CLI do Azure

A CLI do Azure pode ser executada em vários ambientes de shell, mas com pequenas variações de formato. Se você tiver resultados inesperados com comandos da CLI do Azure, confira Como usar a CLI do Azure com êxito.

Próximas etapas

Para ver o código, os problemas atuais e as versões, consulte custom-script-extension-linux.