Partilhar via


Extensões de máquina virtual e recursos para Linux

As extensões de máquina virtual (VM) do Azure são pequenos aplicativos que fornecem tarefas de configuração e automação pós-implantação em VMs do Azure. Por exemplo, se uma VM requer instalação de software, proteção antivírus ou a capacidade de executar um script dentro dela, pode usar uma extensão VM.

Pode executar extensões de VM do Azure usando o Azure CLI, Azure PowerShell, templates do Azure Resource Manager (templates ARM) e o portal Azure. Você pode agrupar extensões com uma nova implantação de VM ou executá-las em qualquer sistema existente.

Este artigo fornece uma visão geral das extensões de VM do Azure, pré-requisitos para usá-las e orientação sobre como detetá-las, gerenciá-las e removê-las. Este artigo fornece informações gerais porque existem muitas extensões de VM disponíveis. Cada um tem uma configuração potencialmente única e a sua própria documentação.

Observação

Experimenta o VM assist para diagnósticos mais rápidos. Recomendamos que execute o VM assist para Windows ou o VM assist para Linux. Essas ferramentas de diagnóstico baseadas em script ajudam você a identificar problemas comuns que afetam o Agente Convidado da VM do Azure e a integridade geral da VM.

Se estiver a experienciar problemas de desempenho com máquinas virtuais, antes de contactar o suporte, execute estas ferramentas.

Casos de uso e exemplos

Cada extensão de VM do Azure tem um caso de uso específico. Os exemplos incluem:

Para além das extensões específicas de processos, está disponível uma extensão Custom Script para VMs Windows e Linux. A extensão Custom Script para Linux permite que qualquer script Bash seja executado em uma VM. Os scripts personalizados são úteis para projetar implantações do Azure que exigem configuração além do que as ferramentas nativas do Azure podem fornecer.

Pré-requisitos

Observação

As extensões são suportadas apenas em distribuições Linux Endossadas no Azure.

Agente Linux do Azure

Para gerir a extensão na VM, tens de ter o Azure Linux Agent instalado. Algumas extensões individuais têm pré-requisitos, como acesso a recursos ou dependências.

O Agente Linux do Azure gerencia interações entre uma VM do Azure e o controlador de malha do Azure. O agente é responsável por muitos aspetos funcionais da implantação e do gerenciamento de VMs do Azure, incluindo a execução de extensões de VM.

O Agente Linux do Azure vem pré-instalado nas imagens do Azure Marketplace. Também pode instalá-lo manualmente em sistemas operativos suportados.

O agente é executado em vários sistemas operacionais. No entanto, a estrutura de extensões tem um limite para os sistemas operacionais que as extensões usam. Algumas extensões não são suportadas em todos os sistemas operativos e podem emitir o código de erro 51 ("SO não suportado"). Consulte a documentação de cada extensão para verificar a sua aptidão para suporte.

Acesso à rede

Os pacotes de extensão são baixados do repositório de extensões do Armazenamento do Azure. Os carregamentos de status da extensão são postados no Armazenamento do Azure.

Se você usar uma versão com suporte do Agente Linux do Azure, não precisará permitir o acesso ao Armazenamento do Azure na região da VM. Você pode usar o agente para redirecionar a comunicação para o controlador de malha do Azure para comunicações do agente. Se você estiver em uma versão sem suporte do agente, precisará permitir o acesso de saída ao Armazenamento do Azure nessa região a partir da VM.

Importante

Se bloquear o acesso ao endereço IP privado 168.63.129.16 usando o firewall de convidados, as extensões falham mesmo que use uma versão suportada do agente ou configure o acesso de saída. Além disso, se a VM não tiver acesso de saída a *.blob.windows.net e *.blob.storage.azure.net, a inicialização do Azure Linux Agent e a instalação de extensões acarretam mais atrasos. Para evitar esses atrasos, assegure que o acesso a estes pontos finais é permitido.

Só podes usar agentes para descarregar pacotes de extensão e o estado dos relatórios. Por exemplo, se uma instalação de extensão precisar de descarregar um script do GitHub (extensão Custom Script) ou precisar de acesso ao Azure Storage (Azure Backup), precisa de abrir mais portas de firewall ou de grupos de segurança de rede (NSG). Diferentes extensões têm requisitos diferentes porque são candidaturas. Para extensões que exigem acesso ao Armazenamento do Azure, você pode permitir o acesso usando marcas de serviço do Azure NSG.

Para redirecionar solicitações de tráfego de agente, o Agente Linux do Azure tem suporte ao servidor proxy. Este suporte a servidores proxy não aplica extensões. Você deve configurar cada extensão individual para trabalhar com um proxy.

Descubra extensões de VM

Muitas extensões de VM estão disponíveis para uso com VMs do Azure. Para ver uma lista completa, use az vm extension image list. O exemplo a seguir lista todas as extensões disponíveis no local westus :

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

Executar extensões de VM

As extensões de VM do Azure são executadas em VMs existentes. Essa funcionalidade é útil quando precisas de fazer alterações de configuração ou recuperar a conectividade numa VM já implementada. As extensões de VM também podem ser integradas em desdobramentos de modelos ARM. Usando extensões com modelos ARM, você pode implantar e configurar VMs do Azure sem intervenção pós-implantação.

Você pode usar os seguintes métodos para executar uma extensão em uma VM existente.

Azure CLI (Interface de Linha de Comando da Azure)

Você pode executar extensões de VM do Azure em uma VM existente usando o comando az vm extension set . O exemplo a seguir executa a extensão Script Personalizado em uma VM chamada myVM em um grupo de recursos chamado myResourceGroup. Substitua o nome do grupo de recursos de exemplo, nome da VM e script para executar https:\//raw.githubusercontent.com/me/project/hello.sh com a sua própria informação.

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

Quando a extensão é executada corretamente, a saída é semelhante ao exemplo a seguir:

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

Azure PowerShell

Você pode executar extensões de VM do Azure em uma VM existente usando o comando Set-AzVMExtension . O exemplo a seguir executa a extensão Script Personalizado em uma VM chamada myVM em um grupo de recursos chamado myResourceGroup. Substitua o nome do grupo de recursos de exemplo, nome da VM e script para executar https:\//raw.githubusercontent.com/me/project/hello.sh com a sua própria informação.

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

Quando a extensão é executada corretamente, a saída é semelhante ao exemplo a seguir:

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

portal do Azure

Você pode aplicar extensões de VM a uma VM existente por meio do portal do Azure. Selecione a VM no portal, selecione Extensões e, em seguida, selecione Adicionar. Escolha a extensão desejada na lista de extensões disponíveis e siga as instruções do assistente.

A imagem seguinte mostra a instalação da extensão Custom Script para Linux a partir do portal Azure.

Captura de tela da caixa de diálogo para instalar a extensão Script Personalizado para Linux.

Modelos do Azure Resource Manager

Você pode adicionar extensões de VM a um modelo ARM e executá-las com a implantação do modelo. Ao implantar uma extensão com um modelo, você pode criar implantações do Azure totalmente configuradas.

Por exemplo, o JSON seguinte é retirado de um template ARM completo que implementa um conjunto de VMs balanceadas de carga e uma base de dados Azure SQL. Depois instala uma aplicação .NET Core em cada VM. A extensão VM cuida da instalação do software.

{
    "apiVersion": "2015-06-15",
    "type": "extensions",
    "name": "config-app",
    "location": "[resourceGroup().location]",
    "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
    ],
    "tags": {
    "displayName": "config-app"
    },
    "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
        ]
    },
    "protectedSettings": {
        "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
    }
}

Para mais informações sobre como criar modelos ARM, consulte Máquinas Virtuais num Modelo do Gestor de Recursos do Azure.

Ajude a proteger os dados de extensão da VM

Quando você executa uma extensão de VM, pode ser necessário incluir informações confidenciais, como credenciais, nomes de contas de armazenamento e chaves de acesso. Muitas extensões de VM incluem uma configuração protegida que criptografa dados e apenas os descriptografa dentro da VM de destino. Cada extensão tem um esquema de configuração protegido específico. Cada extensão é detalhada na sua documentação específica.

O exemplo a seguir mostra uma instância da extensão Custom Script para Linux. O comando a ser executado inclui um conjunto de credenciais. Neste exemplo, o comando a ser executado não é criptografado.

{
  "apiVersion": "2015-06-15",
  "type": "extensions",
  "name": "config-app",
  "location": "[resourceGroup().location]",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
      ],
      "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
  }
}

Mover a propriedade commandToExecute para as configurações protected ajuda a proteger a cadeia de execução, conforme mostrado no exemplo a seguir:

{
  "apiVersion": "2015-06-15",
  "type": "extensions",
  "name": "config-app",
  "location": "[resourceGroup().location]",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
      ]
    },
    "protectedSettings": {
      "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
  }
}

Como os agentes e extensões são atualizados

Agentes e extensões compartilham o mesmo mecanismo de atualização automática.

Quando uma atualização está disponível e as atualizações automáticas estão habilitadas, a atualização é instalada na VM somente depois que há uma alteração em uma extensão ou após outras alterações no modelo de VM, como:

  • Discos de dados
  • Extensões
  • Etiquetas de extensão
  • Contêiner de diagnóstico de inicialização
  • Segredos do sistema operativo convidado
  • Tamanho da VM
  • Perfil da rede

Os editores disponibilizam atualizações para regiões em diferentes momentos, por isso podes ter VMs em diferentes regiões e versões diferentes.

Observação

Algumas atualizações podem exigir regras adicionais de firewall. Para obter mais informações, consulte Acesso à rede.

Atualizações do agente

O Linux VM Agent contém o código do Provisioning Agent e o código de manipulação de extensões em um pacote. Eles não podem ser separados.

Você pode desabilitar o Agente de Provisionamento quando quiser provisionar no Azure usando cloud-init.

As versões suportadas dos agentes podem usar atualizações automáticas. O único código que pode ser atualizado é o código de manipulação de extensão, não o código do Agente de Provisionamento. O código do Provisioning Agent é um código que é executado uma vez.

O código de manipulação de extensão é responsável por:

  • Comunicação com o Azure Fabric.
  • Lidando com as operações de extensão da VM, como instalações, relatando o estado, atualizando as extensões individuais e removendo extensões. As atualizações contêm correções de segurança, correções de bugs e aprimoramentos no código de manipulação de extensões.

Quando o agente é instalado, um daemon pai é criado. Este pai gera então um processo filho que gere extensões. Se uma atualização estiver disponível para o agente, ela será baixada. O pai interrompe o processo filho, atualiza-o e, em seguida, reinicia-o. Se ocorrer um problema com a atualização, o processo pai reverte para a versão filha anterior.

O processo pai não pode ser atualizado automaticamente. Só um pacote de distribuição pode atualizar o pai.

Para verificar que versão está a usar, veja waagent:

waagent --version

O resultado é semelhante ao seguinte exemplo:

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

Na saída do exemplo anterior, o pai (ou a versão implantada do pacote) é WALinuxAgent-2.2.45. O Goal state agent valor é a versão de atualização automática.

É altamente recomendável que você sempre habilite a atualização automática para o agente: AutoUpdate.Enabled=y. Se não ativares a atualização automática, tens de continuar a atualizar manualmente o agente. Também não recebes correções de bugs nem de segurança.

Atualizações de extensões

Quando uma atualização de extensão está disponível e as atualizações automáticas são habilitadas, depois que ocorre uma alteração no modelo de VM , o Agente Linux do Azure baixa e atualiza a extensão.

As atualizações automáticas de extensão são secundárias ou hotfix. Você pode optar por receber ou desativar atualizações menores ao provisionar a extensão. O exemplo a seguir mostra como atualizar automaticamente versões secundárias em um modelo ARM usando "autoUpgradeMinorVersion": true,:

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

Para obter as últimas correções de bugs de versões secundárias, é altamente recomendável selecionar sempre as atualizações automáticas nas suas implementações de extensões. Não é possível recusar atualizações de hotfix que contenham correções de segurança ou de bugs importantes.

Se você desabilitar as atualizações automáticas ou precisar atualizar uma versão principal, use az vm extension set ou Set-AzVMExtension e especifique a versão de destino.

Como identificar atualizações de extensão

Identificar se a extensão está definida com autoUpgradeMinorVersion em uma VM

Você pode ver no modelo de VM se a extensão foi provisionada com autoUpgradeMinorVersion. Para confirmar, use o az vm show e forneça o grupo de recursos e o nome da VM:

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

O exemplo de saída a seguir mostra que autoUpgradeMinorVersion está definido como true:

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

Identificar quando ocorreu um evento autoUpgradeMinorVersion

Para ver quando ocorreu uma atualização para a extensão, revise os logs do agente na VM em /var/log/waagent.log.

No exemplo a seguir, a VM tinha Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025 instalada. Um hotfix estava disponível para Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027.

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

Permissões do agente

Para executar suas tarefas, o agente precisa ser executado como root.

Solucionar problemas de extensões de VM

Cada extensão de VM pode ter etapas específicas de solução de problemas. Por exemplo, quando você usa a extensão de script personalizado, você pode encontrar detalhes de execução de script localmente na VM onde a extensão foi executada.

As seguintes ações de solução de problemas se aplicam a todas as extensões de VM:

  • Verifique o registo do Azure Linux Agent. Vê a atividade quando a tua extensão estava a ser provisionada em /var/log/waagent.log.
  • Verifique os logs de extensão para obter mais detalhes em /var/log/azure/<extensionName>.
  • Verifique as seções de solução de problemas na documentação específica da extensão para obter códigos de erro, problemas conhecidos e outras informações específicas da extensão.
  • Observe os logs do sistema. Verifique se outras operações interferiam com a extensão, como uma instalação prolongada de outra aplicação que exigia acesso exclusivo ao gestor de pacotes.

Razões comuns para falhas de extensões

  • As extensões têm 20 minutos para serem executadas. (Exceções são Custom Script e Chef, que têm 90 minutos.) Se a sua implementação ultrapassar este tempo, é considerado um timeout. A causa de um tempo de espera pode ser:

    • VMs com poucos recursos.
    • Outras configurações de VM ou tarefas de arranque que consomem grandes quantidades de recursos enquanto a extensão tenta provisionar.
  • Os pré-requisitos mínimos não são atendidos. Algumas extensões dependem de versões de VM, como as imagens de computação de alto desempenho. As extensões podem ter determinados requisitos de acesso à rede, como a comunicação com o Armazenamento do Azure ou serviços públicos. Outros exemplos podem ser o acesso a repositórios de pacotes, a falta de espaço em disco ou restrições de segurança.

  • O acesso ao gerenciador de pacotes é exclusivo. Em alguns casos, uma configuração de VM de longa execução e uma instalação de extensão podem entrar em conflito porque ambas precisam de acesso exclusivo ao gerenciador de pacotes.

Ver estado da extensão

Depois de uma extensão de VM ser executada contra uma VM, use azvm vm get-instance-view para devolver o estado da extensão:

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

O resultado é semelhante ao seguinte exemplo:

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

Você também pode encontrar o status de execução da extensão no portal do Azure. Seleciona a VM, seleciona Extensões e depois seleciona a extensão que queres.

Execute novamente uma extensão de VM

Podem existir casos em que uma extensão de VM tenha de ser reexecutada. Para reexecutar uma extensão, remove-a e depois volta a executar a extensão com um método de execução à sua escolha.

Para remover uma extensão, use az vm extension delete:

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

Você também pode remover uma extensão no portal do Azure:

  1. Selecione uma VM.
  2. Selecione Extensões.
  3. Selecione a extensão.
  4. Selecione Desinstalar.

Referência comum de extensão de VM

Nome da extensão Descrição
Extensão de script personalizado para Linux Execute scripts contra uma VM Azure.
Extensão VMAccess Recuperar o acesso a uma VM Azure. Você também pode usá-lo para gerenciar usuários e credenciais.
  • Para obter mais informações sobre extensões de VM, consulte Extensões e recursos de máquina virtual do Azure.