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

Atenção

Este artigo faz referência ao CentOS, uma distribuição Linux que está se aproximando do status de Fim da Vida Útil (EOL). Por favor, considere o seu uso e planeje de acordo. Para obter mais informações, consulte as diretrizes de Fim da Vida Útil do CentOS.

A Extensão de Script Personalizada Versão 2 baixa e executa scripts em máquinas virtuais (VMs) do Azure. Use esta extensão para configuração pós-implantação, instalação de software ou qualquer outra tarefa de configuração ou gerenciamento. Você pode baixar scripts do Armazenamento do Azure ou de outro local acessível da Internet ou fornecê-los ao tempo de execução da extensão.

A Extensão de Script Personalizada integra-se com 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 Personalizada da CLI do Azure e como executar a extensão usando um modelo do Azure Resource Manager. Este artigo também fornece etapas de solução de problemas para sistemas Linux.

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

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

Use a versão 2 para implantações novas e existentes. A nova versão é um substituto drop-in. A migração é tão fácil quanto alterar o nome e a versão. Não é necessário alterar a configuração da extensão.

Pré-requisitos

Distribuições Linux suportadas

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+ Não suportado
Oracle Linux 6.4+, 7.x+, 8.x+ Não suportado
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+

Localização do script

Pode definir a extensão para utilizar as suas credenciais de Armazenamento de Blobs do Azure de modo a que possa aceder ao Armazenamento de Blobs do Azure. A localização do script pode ser em qualquer parte, desde que a VM possa encaminhar para esse ponto final, por exemplo, GitHub ou um servidor de ficheiros interno.

Ligação à Internet

Para transferir um script externamente, tal como do GitHub ou do Armazenamento do Azure, tem de 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, poderá permitir o acesso utilizando etiquetas de serviço do Azure NSG para Armazenamento.

Se o seu script estiver num servidor local, poderá ainda ter de abrir outras portas de firewall ou do NSG.

Sugestões

  • A taxa de falha mais alta desta extensão deve-se a erros de sintaxe no script. Verifique se o script é executado sem erros. Coloque mais registos no script para facilitar a localização de falhas.
  • Escreva scripts que sejam idempotentes. de modo a que a sua execução mais de uma vez acidentalmente, não cause alterações no sistema.
  • Certifique-se de que os scripts não requerem dados do utilizador quando são executados.
  • O script pode ser executado durante 90 minutos. Se a execução for mais longa resulta numa falha do aprovisionamento da extensão.
  • Não coloque reinícios no script. Reiniciar causa problemas noutras extensões que estão a ser instaladas e a extensão não continua após o reinício.
  • Se tiver um script que possa causa um reinício antes da instalação das aplicações e executa scripts, agende o reinício utilizando uma tarefa agendada ou com ferramentas como as extensões DSC, Chef ou Puppet.
  • Não execute um script que cause uma paragem ou atualização do Agente Linux do Azure. Isto poderá deixar a extensão num estado de transição e resultar num tempo limite excedido.
  • A extensão executa um script apenas uma vez. Se quiser executar um script em cada arranque, pode utilizar uma imagem cloud-init e utilizar um módulo Scripts por Arranque. Em alternativa, pode utilizar o script para criar uma unidade de serviço systemd .
  • Apenas pode ter uma versão de uma extensão aplicada na VM. Para executar um segundo script personalizado, atualize a extensão existente com uma nova configuração. Em alternativa, pode remover a Extensão de Script Personalizado e voltar a aplicá-la com o script atualizado.
  • Se quiser agendar quando é que um script é executado, utilize a extensão para criar uma tarefa agendada.
  • Quando o script estiver em execução, vê apenas um estado de extensão em transição no portal ou na CLI do Azure. Se quiser atualizações de estado mais frequentes para um script em execução, crie a sua própria solução.
  • A Extensão de Script Personalizado não suporta servidores proxy de forma nativa. No entanto, pode utilizar uma ferramenta de transferência de ficheiros, como o Curl que suporte servidores proxy no script.
  • Tenha em atenção as localizações de diretório não predefinidas de que os scripts ou comandos poderão depender. Tenha uma lógica para lidar com esta situação.

Esquema de extensão

A configuração da Extensão de Script Personalizada especifica coisas como o local do script e o comando a ser executado. Você pode armazenar essas informações em arquivos de configuração, especificá-las na linha de comando ou especificá-las em um modelo do Azure Resource Manager.

Você pode armazenar dados confidenciais em uma configuração protegida, que é criptografada e descriptografada apenas na VM de destino. A configuração protegida é útil quando o comando de execução inclui segredos como uma senha. Eis 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>"
    }
  }
}

Nota

A managedIdentity propriedade não deve ser usada em conjunto com a storageAccountNamestorageAccountKey propriedade.

Valores de propriedade

Nome Valor ou exemplo Tipo de dados
apiVersion 2019-03-01 data
editora Microsoft.Azure.Extensions string
tipo CustomScript string
typeHandlerVersion 2.1 número inteiro
fileUris https://github.com/MyProject/Archive/MyPythonScript.py matriz
commandToExecute python MyPythonScript.py \<my-param1> string
. IyEvYmluL3NoCmVjaG8gIlVwZGF0aW5nIHBhY2thZ2VzIC4uLiIKYXB0IHVwZGF0ZQphcHQgdXBncmFkZSAteQo= string
skipDos2Unix false boolean
carimbo de data/hora 123456789 Inteiro de 32 bits
storageAccountName examplestorageacct string
storageAccountKey TmJK/1N3AbAZ3q/+hOXoi/l73zOqsaxXDhqa9Y83/v5UpXQp2DQIBuv2Tifp60cE/OaHsJZmQZ7teQfczQj8hg== string
managedIdentity { } ou { "clientId": "31b403aa-c364-4240-a7ff-d85fb6cd7232" } ou { "objectId": "12dd289c-0583-46e5-b9b4-115d5c19ef4b" } Objeto JSON

Detalhes do valor da propriedade

Property 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 usando 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 essa propriedade em vez de script se o comando contiver segredos, como senhas.
. Obrigatório se commandToExecute não estiver definido Um script codificado em Base64 e, opcionalmente, gzip'ed executado por /bin/sh.
skipDos2Unix Opcional Defina esse valor como false se quiser ignorar a conversão dos2unix de URLs ou scripts de arquivos baseados em script.
carimbo de data/hora Opcional Altere esse valor apenas para disparar uma nova execuçã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 fileUris valores deverão ser URLs para 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, string), que é a ID do cliente da identidade gerenciada, e objectId (opcional, string), que é a ID do objeto da identidade gerenciada.

As configurações públicas são enviadas em texto não criptografado para a VM onde o script é 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 como foram enviadas. Ou seja, se as configurações foram criptografadas, elas são salvas criptografadas na VM. O certificado usado para descriptografar os valores criptografados é armazenado na VM. O certificado também é usado para descriptografar configurações, se necessário, em tempo de execução.

O uso de configurações públicas pode ser útil para depuração, mas recomendamos que você use 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 sejam definidos em configurações públicas e protegidas.

  • 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 para \n. Essa tradução ainda existe e está ativada por padrão. Essa conversão é aplicada a todos os arquivos baixados ou à configuração de fileUris script com base em 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 supõe-se que seja um script executado 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 dos2unix é executada. Você pode pular a conversão dos2unix definindo skipDos2Unix para true:

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

Propriedade: script

A extensão de script personalizado suporta a execução de um script definido pelo usuário. As configurações de script se combinam commandToExecute e fileUris em uma única configuração. Em vez de ter que configurar um arquivo para download do Armazenamento do 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.

Aqui estão alguns requisitos:

  • O script deve ser codificado em Base64.
  • O script pode opcionalmente ser gzip'ed.
  • Você pode usar a configuração de script em configurações públicas ou protegidas.
  • O tamanho máximo dos dados do parâmetro script é de 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 Custom Script Extension tomando a saída do seguinte comando:

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

Na maioria dos casos, o script pode opcionalmente ser gzip'ed para reduzir ainda mais o tamanho. A Extensão de Script Personalizada deteta automaticamente o uso da compactação gzip.

cat script | gzip -9 | base64 -w 0

A extensão de script personalizado usa o seguinte algoritmo para executar um script:

  1. Afirme que o comprimento do valor do script não exceda 256 KB.
  2. Base64 decodificar o valor do script.
  3. Tente compactar o valor decodificado em Base64.
  4. Escreva 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

Nota

Essa propriedade deve 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 de URLs fornecidas na fileUris configuração. Essa abordagem permite que a Extensão de Script Personalizada acesse blobs ou contêineres privados do Armazenamento do 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 pelo usuário à VM ou ao Conjunto de Dimensionamento de Máquina Virtual onde se espera que a Extensão de Script Personalizada seja executada. Em seguida, conceda à identidade gerenciada acesso ao contêiner ou blob de Armazenamento do Azure.

Para usar a identidade atribuída pelo sistema na VM de destino ou no Conjunto de Escala da Máquina Virtual, 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 de destino ou no Conjunto de Dimensionamento de Máquina Virtual, configure managedidentity com a ID do cliente ou a ID do 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" }
}

Nota

A managedIdentity propriedade não deve ser usada em conjunto com a storageAccountNamestorageAccountKey propriedade.

Implementação de modelos

Você pode implantar extensões de VM do Azure usando 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 Personalizada 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"
      ]
    }
  }
}

Nota

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

Quando você usa a CLI do Azure para executar a Extensão de Script Personalizada, crie um arquivo ou arquivos de configuração. No mínimo, o arquivo de configuração deve conter commandToExecute. O az vm extension set comando refere-se 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

Este 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 o 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"],
      "commandToExecute": "./config-music.sh"
    }
    EOF
    
  2. Execute o seguinte comando:

    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 usa o seguinte conteúdo formatado em JSON:

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

Execute o seguinte comando:

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ública 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ública usando o 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 o editor de texto de sua escolha ou usando o seguinte comando da CLI:

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

    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 Personalizada do portal do Azure, não terá controle sobre a expiração do token SAS para acessar o script em sua conta de armazenamento. A implantação inicial funciona, mas quando o token SAS da conta de armazenamento expira, qualquer operação de dimensionamento subsequente falha porque a Extensão de Script Personalizada não pode 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 Personalizada em um Conjunto de Dimensionamento de Máquina Virtual. Dessa forma, você pode optar por usar uma identidade gerenciada ou ter controle direto da expiração do token SAS para acessar o script em sua conta de armazenamento pelo tempo que precisar.

Resolução de Problemas

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

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. Tem a seguinte aparência:

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 refere-se ao download do pacote de 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 você pode encontrar aqui:

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

Procure a execução individual. Tem a seguinte aparência:

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 enable comando que inicia este log.
  • As configurações passaram para a extensão.
  • A extensão baixando o arquivo e o resultado dessa ação.
  • O comando que está sendo executado e o resultado.

Você também pode recuperar o estado de execução da Extensão de Script Personalizada, incluindo os argumentos reais passados 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 os comandos da CLI do Azure, consulte Como usar a CLI do Azure com êxito.

Próximos passos

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