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

As extensões de máquina virtual (VM) do Azure são pequenas aplicações que proporcionam tarefas de automação e configuração pós-implementação nas VMs do Azure. Por exemplo, se uma máquina virtual exigir instalação de software, proteção antivírus ou a capacidade de executar um script dentro dela, você poderá usar uma extensão de VM.

Você pode executar extensões de VM do Azure usando a CLI do Azure, o PowerShell, os modelos do Azure Resource Manager (modelos ARM) e o portal do 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 generalizadas porque muitas extensões de VM estão disponíveis. Cada um tem uma configuração potencialmente exclusiva e sua própria documentação.

Casos de uso e exemplos

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

  • Configure o monitoramento de uma VM usando a extensão de VM do Microsoft Monitoring Agent.
  • Configure o monitoramento de sua infraestrutura do Azure usando a extensão Chef ou Datadog .

Além de extensões específicas do processo, uma extensão de script personalizado está disponível para máquinas virtuais 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

Agente Linux do Azure

Para manipular a extensão na VM, você precisa do Agente Linux do Azure 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 é pré-instalado em imagens do Azure Marketplace. Ele também pode ser instalado manualmente em sistemas operacionais 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"). Verifique a capacidade de suporte da documentação da extensão individual.

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 você bloqueou o acesso ao endereço IP privado 168.63.129.16 usando o firewall convidado, as extensões falham mesmo se você estiver usando uma versão suportada do agente ou tiver configurado o acesso de saída.

Os agentes só podem ser usados para baixar pacotes de extensão e status de relatórios. Por exemplo, se uma instalação de extensão precisar baixar um script do GitHub (extensão de Script Personalizado) ou precisar de acesso ao Armazenamento do Azure (Backup do Azure), você precisará abrir portas adicionais de firewall ou NSG (grupo de segurança de rede). Extensões diferentes têm requisitos diferentes, porque são aplicativos por direito próprio. 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. No entanto, esse suporte ao servidor 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. Isso é útil quando você precisa fazer alterações de configuração ou recuperar a conectividade em uma VM já implantada. As extensões de VM também podem ser agrupadas com implantações de modelo 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.

CLI do 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, o nome da VM e o script a ser executado (https://raw.githubusercontent.com/me/project/hello.sh) por suas próprias informações.

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, o nome da VM e o script a ser executado (https://raw.githubusercontent.com/me/project/hello.sh) por suas próprias informações.

$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 a seguir mostra a instalação da extensão Script Personalizado para Linux a partir do portal do Azure:

Screenshot of the dialog for installing the Custom Script extension for 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 a seguir é retirado de um modelo ARM completo que implanta um conjunto de VMs com balanceamento de carga e um banco de dados SQL do Azure e, em seguida, instala um aplicativo .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 obter mais informações sobre como criar modelos ARM, consulte Máquinas virtuais em um modelo do Azure Resource Manager.

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, e cada um é detalhado na documentação específica da extensão.

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 para a configuração ajuda a proteger a cadeia de execução, conforme mostrado no exemplo a commandToExecuteprotected 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
  • Tags de extensão
  • Contêiner de diagnóstico de inicialização
  • Segredos do SO convidado
  • Tamanho da VM
  • Perfil de rede

Os editores disponibilizam atualizações para regiões em vários momentos, portanto, é possível que você possa ter VMs em regiões diferentes em versões diferentes.

Nota

Algumas atualizações podem exigir regras de firewall adicionais. 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 é o código run-once.

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

  • Comunicação com a malha do Azure.
  • Manipulando as operações de extensão da VM, como instalações, status de relatório, atualização das extensões individuais e remoção de 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. Em seguida, esse pai gera um processo filho que é usado para manipular 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 houver um problema com a atualização, o processo pai será revertido para a versão filho anterior.

O processo pai não pode ser atualizado automaticamente. O pai só pode ser atualizado por uma atualização do pacote de distribuição.

Para verificar qual versão você está executando, verifique waagent o seguinte:

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 você não habilitar a atualização automática, precisará continuar atualizando manualmente o agente e não obterá correções de bugs e 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 que você sempre selecione a atualização automática em suas implantações de extensão. Não é possível desativar atualizações de hotfix que contenham correções de segurança ou bugs de chave.

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 verificar, use az vm show e forneça o grupo de recursos e o nome da VM da seguinte maneira:

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 foi 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:

  • Para verificar o log do Agente Linux do Azure, examine a atividade quando sua extensão estava sendo 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 há outras operações que possam ter interferido na extensão, como uma instalação de longa duração de outro aplicativo que exigiu acesso exclusivo ao gerenciador de pacotes.

Razões comuns para falhas de extensão

  • As extensões têm 20 minutos para serem executadas. (As exceções são o Script Personalizado e o Chef, que têm 90 minutos.) Se sua implantação exceder esse tempo, ele será marcado como um tempo limite. A causa disso pode ser VMs de poucos recursos ou outras configurações de VM ou tarefas de inicialização estão consumindo grandes quantidades de recursos enquanto a extensão está tentando provisionar.

  • Os pré-requisitos mínimos não são atendidos. Algumas extensões têm dependências em SKUs de VM, como imagens HPC. 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 que uma extensão de VM tiver sido executada em uma VM, use az vm get-instance-view para retornar o status da extensão da seguinte maneira:

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. Selecione a VM, selecione Extensões e, em seguida, selecione a extensão desejada.

Execute novamente uma extensão de VM

Pode haver casos em que uma extensão de VM precise ser executada novamente. Você pode executar novamente uma extensão removendo-a e, em seguida, executando novamente a extensão com um método de execução de sua escolha.

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

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 de extensão de VM comum

Nome da extensão Description
Extensão de script personalizado para Linux Execute scripts em uma máquina virtual do Azure.
Extensão VMAccess Recupere o acesso a uma máquina virtual do Azure. Você também pode usá-lo para gerenciar usuários e credenciais.
Extensão do Azure Diagnostics Gerencie o Diagnóstico do Azure.

Próximos passos

Para obter mais informações sobre extensões de VM, consulte Extensões e recursos de máquina virtual do Azure.