Agentes do conjunto de dimensionamento de máquinas virtuais do Azure

Azure DevOps Services

Os agentes do Conjunto de Dimensionamento de Máquinas Virtuais do Azure, chamados de agentes de conjunto de dimensionamento, são uma forma de agentes auto-hospedados que podem ser dimensionados automaticamente para atender suas demandas. Essa elasticidade reduz a necessidade de executar agentes dedicados o tempo todo. Ao contrário dos agentes hospedados pela Microsoft, você tem flexibilidade sobre o tamanho e a imagem dos computadores nos quais os agentes são executados.

Se você gosta dos agentes hospedados pela Microsoft, mas é limitado pelo que eles oferecem, considere os agentes do conjunto de dimensionamento. Estes são alguns exemplos:

  • Você precisa de mais memória, mais processadores, mais armazenamento ou mais E/S do que o que oferecemos nos agentes nativos hospedados pela Microsoft.
  • Você precisa da VM NCv2 com conjuntos de instruções específicos para aprendizado de máquina.
  • Você precisa implantar em um Serviço de Aplicativo do Azure privado em uma VNET privada sem conectividade de entrada.
  • Você precisa abrir um firewall corporativo para endereços IP específicos para que os agentes hospedados pela Microsoft possam se comunicar com seus servidores.
  • Você precisa restringir a conectividade de rede dos computadores do agente e permitir que eles alcancem apenas sites aprovados.
  • Você não pode obter agentes suficientes de Microsoft para atender às suas necessidades.
  • Seus trabalhos excedem o tempo limite do agente hospedado pela Microsoft.
  • Você não pode particionar trabalhos paralelos hospedados pela Microsoft em projetos individuais ou equipes em sua organização.
  • Você deseja executar vários trabalhos consecutivos em um agente para aproveitar os caches incrementais de pacotes de origem e no nível do computador.
  • Você deseja executar a configuração ou o aquecimento de cache antes que um agente comece a aceitar trabalhos.

Se você gosta de agentes auto-hospedados, mas deseja simplificar o gerenciamento deles, considere os agentes do conjunto de dimensionamento. Estes são alguns exemplos:

  • Você não quer executar agentes dedicados 24 horas por dia. Você deseja desprovisionar computadores de agente que não estão sendo usados para executar trabalhos.
  • Você executa código não confiável no pipeline e deseja refazer a imagem dos computadores do agente após cada trabalho.
  • Você deseja simplificar a atualização periódica da imagem base para os agentes.

Observação

  • Não é possível executar agentes do Mac usando conjuntos de dimensionamento. Você só pode executar agentes do Windows ou do Linux dessa maneira.

  • O uso de pools de agentes do VMSS para o Azure DevOps Services só tem suporte para a nuvem pública do Azure (serviço global). Atualmente, os pools de agentes do VMSS não dão suporte a outras ofertas de nuvem nacional.

  • Você não deve associar um VMSS a vários pools.

Criar o conjunto de dimensionamento

Para se preparar para criar agentes de conjunto de dimensionamento, primeiro você deve criar um Conjunto de Dimensionamento de Máquinas Virtuais no portal do Azure. Você deve criar o Conjunto de Dimensionamento de Máquinas Virtuais de uma certa maneira para que o Azure Pipelines possa gerenciá-lo. Em particular, você deve desabilitaro dimensionamento automático para que o Azure Pipelines possa determinar como executar o dimensionamento com base no número de trabalhos de pipeline de entrada. Recomendamos que você use as etapas a seguir para criar o conjunto de dimensionamento.

No exemplo a seguir, um novo grupo de recursos e um Conjunto de Dimensionamento de Máquinas Virtuais são criados com o Azure Cloud Shell usando a imagem de VM do UbuntuLTS.

Observação

Neste exemplo, a imagem de VM do UbuntuLTS é usada para o conjunto de dimensionamento. Se você precisar de uma imagem de VM personalizada como base para seu agente, crie a imagem personalizada antes de criar o conjunto de dimensionamento seguindo as etapas em Criar um conjunto de dimensionamento com imagem, software ou tamanho de disco personalizado.

  1. Navegue até o Azure Cloud Shell em https://shell.azure.com/.

  2. Execute o comando a seguir para verificar sua assinatura padrão do Azure.

    az account list -o table
    

    Se a assinatura desejada não estiver listada como o padrão, selecione-a.

    az account set -s <your subscription ID>
    
  3. Crie um grupo de recursos para o Conjunto de Dimensionamento de Máquinas Virtuais.

    az group create \
    --location westus \
    --name vmssagents
    
  4. Crie um Conjunto de Dimensionamento de Máquinas Virtuais em seu grupo de recursos. Neste exemplo, a imagem de VM do Ubuntu2204 é especificada.

    az vmss create \
    --name vmssagentspool \
    --resource-group vmssagents \
    --image Ubuntu2204 \
    --vm-sku Standard_D2_v4 \
    --storage-sku StandardSSD_LRS \
    --authentication-type SSH \
    --generate-ssh-keys \
    --instance-count 2 \
    --disable-overprovision \
    --upgrade-policy-mode manual \
    --single-placement-group false \
    --platform-fault-domain-count 1 \
    --load-balancer "" \
    --orchestration-mode Uniform
    

    Observação

    O Azure Pipelines não dá suporte ao superprovisionamento e ao dimensionamento automático do conjunto de dimensionamento. Verifique se ambos os recursos estão desabilitados para o conjunto de dimensionamento.

    Como o Azure Pipelines gerencia o conjunto de dimensionamento, as configurações a seguir são necessárias ou recomendadas:

    • --disable-overprovision - obrigatório
    • --upgrade-policy-mode manual - obrigatório
    • --load-balancer "" – O Azure Pipelines não requer um balanceador de carga para rotear trabalhos para os agentes no pool de agentes do conjunto de dimensionamento, mas a configuração de um balanceador de carga é uma maneira de obter um endereço IP para os agentes do conjunto de dimensionamento que você pode usar para regras de firewall. Outra opção para obter um endereço IP para seus agentes do conjunto de dimensionamento é criar seu conjunto de dimensionamento usando as opções --public-ip-address. Para obter mais informações sobre como configurar o conjunto de dimensionamento com um balanceador de carga ou um endereço IP público, confira a documentação dos Conjuntos de Dimensionamento de Máquinas Virtuais e az vmss create.
    • --instance-count 2 – essa configuração não é necessária, mas oferece a oportunidade de verificar se o conjunto de dimensionamento está totalmente funcional antes de criar um pool de agentes. A criação das duas VMs pode demorar vários minutos. Posteriormente, quando você cria o pool de agentes, o Azure Pipelines exclui essas duas VMs e cria novas.

    Importante

    Se você executar esse script usando a CLI do Azure no Windows, deverá colocar ""em --load-balancer "" com aspas simples como esta: --load-balancer '""'

    Se o tamanho da VM der suporte a discos do sistema operacional efêmero, os parâmetros a seguir para habilitar discos do sistema operacional efêmero serão opcionais, mas recomendados para melhorar os tempos para refazer a imagem da máquina virtual.

    • --ephemeral-os-disk true
    • --os-disk-caching readonly

    Importante

    Não há suporte para discos do sistema operacional efêmero em todos os tamanhos de VM. Para obter a lista de tamanhos de VM com suporte, confira Discos do sistema operacional efêmero para VMs do Azure.

    Selecione qualquer imagem do Linux ou do Windows – do Azure Marketplace ou da sua própria imagem personalizada – para criar o conjunto de dimensionamento. Não instale previamente o agente do Azure Pipelines na imagem. O Azure Pipelines instala automaticamente o agente à medida que provisiona novas máquinas virtuais. No exemplo acima, usamos uma imagem UbuntuLTS sem formatação. Para obter instruções sobre como criar e usar uma imagem personalizada, consulte Perguntas frequentes.

    Selecione qualquer SKU de VM e SKU de armazenamento.

    Observação

    As considerações sobre licenciamento nos limitam a distribuir imagens hospedadas pela Microsoft. Não é possível fornecer essas imagens para uso em seus agentes do conjunto de dimensionamento. Mas, os scripts que usamos para gerar essas imagens são de código aberto. Você pode usar esses scripts e criar suas próprias imagens personalizadas.

  5. Depois de criar o conjunto de dimensionamento, acesse o conjunto de dimensionamento no portal do Azure e verifique as seguintes configurações:

    • Política de atualização – Manual

      Verify upgrade policy.

      Você também pode verificar essa configuração executando o seguinte comando da CLI do Azure.

      az vmss show --resource-group vmssagents --name vmssagentspool --output table
      
      Name            ResourceGroup    Location    Zones    Capacity    Overprovision    UpgradePolicy
      --------------  ---------------  ----------  -------  ----------  ---------------  ---------------
      vmssagentspool  vmssagents       westus               0           False            Manual
      
    • Colocação em escala – Escala manual

      Verify manual scale policy.

Importante

O Azure Pipelines não dá suporte à proteção de instância. Verifique se as proteções de instância de ações de redução horizontal e conjunto de dimensionamento estão desabilitadas.

Modos de orquestração

Os conjuntos de dimensionamento de máquinas virtuais do Azure podem ser configurados com dois modos de orquestração: uniforme e flexível. O suporte do Azure Pipelines para o modo de orquestração uniforme geralmente está disponível para todos os clientes.

O modo de orquestração flexível permite que o Azure Pipelines enfileire várias operações de conjunto de dimensionamento em paralelo. O suporte do Azure Pipelines para orquestração flexível está disponível mediante solicitação e está sujeito à avaliação. Os padrões de uso dos clientes precisam indicar um benefício significativo dele. Esses clientes têm grandes conjuntos de dimensionamento, não reutilizam agentes para vários trabalhos, executam vários trabalhos de curta duração em paralelo e usam exclusivamente discos efêmeros em suas VMs. Se você quiser usar esse recurso, entre em contato com nossa equipe de suporte.

Criar o pool de agentes do conjunto de dimensionamento

  1. Acesse as Configurações do projeto do Azure DevOps, selecione Pools de agentes em Pipelines e Adicionar pool para criar um pool de agentes.

    Create agent pool.

    Importante

    Você pode criar seu pool de conjuntos de dimensionamento nas Configurações do projeto ou nas Configurações da organização, mas ao excluir um pool de conjuntos de dimensionamento, você deve excluí-lo das Configurações da organização e não das Configurações do projeto.

  2. Selecione Conjunto de Dimensionamento de Máquinas Virtuais do Azure para o tipo de pool. Selecione a assinatura do Azure que contém o conjunto de dimensionamento, escolha Autorizar e escolha o Conjunto de Dimensionamento de Máquinas Virtuais desejado nessa assinatura. Se você tiver uma conexão de serviço existente, ela poderá ser escolhida na lista em vez da assinatura.

    Importante

    • Para configurar um pool de agentes do conjunto de dimensionamento, você deve ter permissões de Proprietário ou Administrador de Acesso do Usuário na assinatura selecionada. Se você tiver uma dessas permissões, mas receber um erro ao escolher Autorizar, confira solução de problemas.

    • A única conexão de serviço com suporte no momento é uma conexão de serviço do ARM (Azure Resource Manager) com base em uma chave da entidade de serviço. As conexões de serviço do ARM com base em uma credencial de certificado ou em uma Identidade Gerenciada falharão. Ao tentar listar os conjuntos de dimensionamento existentes em sua assinatura, você verá um erro como este:

      Invalid Service Endpoint with Id <guid> and Scope <guid>

  3. Escolha o Conjunto de Dimensionamento de Máquinas Virtuais desejado nessa assinatura.

  4. Especifique um nome para o pool de agentes.

  5. Configure as seguintes opções:

    • Desativar automaticamente as máquinas virtuais após cada uso – Uma nova instância de VM é usada para cada trabalho. A VM fica offline após a execução de um trabalho e a imagem é refeita antes de outro trabalho ser separado.
    • Salvar um agente não íntegro para investigação – Se as VMs do agente não íntegros devem ser salvas para solução de problemas em vez de excluídas.
    • Número máximo de máquinas virtuais no conjunto de dimensionamento – O Azure Pipelines irá escalar horizontalmente o número de agentes, mas não excederá esse limite.
    • Número de agentes a serem mantidos em espera – O Azure Pipelines será dimensionado automaticamente no número de agentes, mas garantirá que sempre haja muitos agentes disponíveis para executar novos trabalhos. Se você definir o Número de agentes a serem mantidos em espera como 0, por exemplo, para conservar o custo de um baixo volume de trabalhos, o Azure Pipelines iniciará uma VM somente quando tiver um trabalho.
    • Atraso em minutos antes de excluir agentes ociosos em excesso – Para considerar a variabilidade na carga de build ao longo do dia, o Azure Pipelines aguardará a duração especificada antes de excluir um agente ocioso em excesso.
    • Configurar VMs para executar testes interativos (somente sistema operacional Windows Server) – Os agentes do Windows podem ser configurados para serem executados desabilitados com logon automático e interface do usuário interativa ou podem ser configurados para serem executados com permissões elevadas. Marque esta caixa para executar desabilitado com interface do usuário interativa. Em ambos os casos, o usuário do agente é membro do grupo Administradores.
  6. Quando as configurações estiverem definidas, escolha Criar para criar o pool de agentes.

Usar o pool de agentes do conjunto de dimensionamento

O uso de um pool de agentes do conjunto de dimensionamento é semelhante a qualquer outro pool de agentes. Você pode usá-lo em pipelines clássicos de build, versão ou YAML. Permissões de usuário, permissões de pipeline, aprovações e outras verificações funcionam da mesma maneira que em qualquer outro pool de agentes. Para obter mais informações, confira Pools de agentes.

Importante

É necessário ter cuidado ao fazer alterações diretamente no conjunto de dimensionamento no portal do Azure.

  • Não é possível alterar muitas das definições de configuração do conjunto de dimensionamento no portal do Azure. O Azure Pipelines atualiza a configuração do conjunto de dimensionamento. Todas as alterações manuais feitas no conjunto de dimensionamento podem interferir na operação do Azure Pipelines.
  • Não é possível renomear ou excluir um conjunto de dimensionamento sem primeiro excluir o pool de conjuntos de dimensionamento no Azure Pipelines.

Como o Azure Pipelines gerencia o conjunto de dimensionamento

Depois que o pool de agentes do conjunto de dimensionamento é criado, o Azure Pipelines dimensiona automaticamente os computadores do agente.

O Azure Pipelines tira amostras do estado dos agentes no pool e das máquinas virtuais no conjunto de dimensionamento a cada 5 minutos. A decisão de reduzir ou escalar horizontalmente é baseada no número de agentes ociosos nesse momento. Um agente será considerado ocioso se estiver online e não estiver executando um trabalho de pipeline. O Azure Pipelines executará uma operação de expansão se uma das seguintes condições for atendida:

  • O número de agentes ociosos fica abaixo do número de agentes em espera especificados
  • Não há agentes ociosos para trabalhos de pipeline de serviço aguardando na fila

Se uma dessas condições for atendida, o Azure Pipelines aumentará o número de VMs. O aumento de escala é feito em incrementos de uma determinada porcentagem do tamanho máximo do pool. Aguarde 20 minutos para que os computadores sejam criados para cada etapa.

O Azure Pipelines é reduzido horizontalmente nos agentes quando o número de agentes ociosos excede a contagem em espera por mais de 30 minutos (configurável usando Atraso em minutos antes de excluir agentes ociosos em excesso).

Para exemplificar, considere um pool de agentes do conjunto de dimensionamento configurado com dois agentes em espera e quatro agentes máximos. Digamos que você queira desativar a VM após cada uso. Além disso, vamos supor que não há VMs para começar no conjunto de dimensionamento.

  • Como o número de agentes ociosos é 0 e, como o número de agentes ociosos está abaixo da contagem em espera de 2, o Azure Pipelines escala horizontalmente e adiciona duas VMs ao conjunto de dimensionamento. Depois que esses agentes ficarem online, haverá dois agentes ociosos.

  • Digamos que um trabalho de pipeline chegue e seja alocado a um dos agentes.

  • Neste momento, o número de agentes ociosos é 1 e isso é menor que a contagem em espera de 2. Portanto, o Azure Pipelines escala horizontalmente e adiciona mais duas VMs (o tamanho de incremento usado neste exemplo). No momento, o pool tem três agentes ociosos e um agente ocupado.

  • Digamos que o trabalho no primeiro agente seja concluído. O Azure Pipelines coloca esse agente offline para refazer a imagem desse computador. Depois de alguns minutos, ele volta com uma nova imagem. Neste momento, teremos quatro agentes ociosos.

  • Caso não sejam recebidos outros trabalhos por 30 minutos (configurável usando Atraso em minutos antes de excluir agentes ociosos em excesso), o Azure Pipelines determinará que há mais agentes ociosos do que o necessário. Portanto, o pool é reduzido horizontalmente para dois agentes.

Ao longo dessa operação, a meta do Azure Pipelines é alcançar o número desejado de agentes ociosos em espera. Os pools são escalados e reduzidos horizontalmente de forma lenta. Ao longo de um dia, o pool será escalado horizontalmente à medida que as solicitações forem enfileiradas pela manhã e reduzidos horizontalmente à medida que a carga diminuir à noite. Você pode observar mais agentes ociosos do que o desejado em vários momentos, o que é esperado à medida que o Azure Pipelines converge gradualmente para as restrições especificadas.

Observação

Pode levar uma hora ou mais para o Azure Pipelines escalar ou reduzir horizontalmente as máquinas virtuais. O Azure Pipelines será escalado horizontalmente em etapas, monitorará as operações em busca de erros e reagirá excluindo computadores inutilizáveis e criando novos no decorrer do tempo. Essa operação corretiva pode levar mais de uma hora.

Para obter a estabilidade máxima, as operações do conjunto de dimensionamento são feitas sequencialmente. Por exemplo, se o pool precisar escalar horizontalmente e também houver computadores não íntegros a serem excluídos, o Azure Pipelines escalará horizontalmente o pool primeiro. Depois que o pool for escalado horizontalmente para alcançar o número desejado de agentes ociosos em espera, os computadores não íntegros serão excluídos, dependendo da configuração de Salvar um agente não íntegro para investigação. Para obter mais informações, consulte Agentes não íntegros.

Devido ao tamanho da amostragem de 5 minutos, é possível que todos os agentes possam estar executando pipelines por um curto período de tempo e nenhuma escala horizontal ocorra.

Personalizando a configuração do agente de pipeline

Você pode personalizar a configuração do Agente do Azure Pipelines definindo variáveis de ambiente em sua imagem personalizada do sistema operacional para o conjunto de dimensionamento. Por exemplo, o diretório de trabalho do agente do conjunto de dimensionamento usa como padrão C:\a para Windows e /agent/_work para Linux. Se você quiser alterar o diretório de trabalho, defina uma variável de ambiente chamada VSTS_AGENT_INPUT_WORK com o diretório de trabalho desejado. Mais informações podem ser encontradas na documentação Configuração Autônoma do Agente de Pipelines . Alguns exemplos incluem:

  • VSTS_AGENT_INPUT_WORK
  • VSTS_AGENT_INPUT_PROXYURL
  • VSTS_AGENT_INPUT_PROXYUSERNAME
  • VSTS_AGENT_INPUT_PROXYPASSWORD

Importante

É necessário ter cuidado ao personalizar o agente do Pipelines. Algumas configurações entrarão em conflito com outras configurações necessárias, fazendo com que o agente falhe no registro e a VM seja excluída. Essas configurações não devem ser definidas ou alteradas:

  • VSTS_AGENT_INPUT_URL
  • VSTS_AGENT_INPUT_AUTH
  • VSTS_AGENT_INPUT_TOKEN
  • VSTS_AGENT_INPUT_USERNAME
  • VSTS_AGENT_INPUT_PASSWORD
  • VSTS_AGENT_INPUT_POOL
  • VSTS_AGENT_INPUT_AGENT
  • VSTS_AGENT_INPUT_RUNASSERVICE
  • ... e qualquer coisa relacionada a Grupos de Implantação.

Como personalizar a inicialização da máquina virtual por meio da extensão de script personalizado

Os usuários podem querer executar scripts de inicialização em seus computadores de agente do conjunto de dimensionamento antes que esses computadores comecem a executar trabalhos de pipeline. Alguns casos de uso comuns para scripts de inicialização incluem a instalação de software, o aquecimento de caches ou a busca de repositórios. Você pode executar scripts de inicialização instalando a Extensão de Script Personalizado para Windows ou a Extensão de Script Personalizado para Linux.

Essa extensão será executada em todas as máquinas virtuais no conjunto de dimensionamento imediatamente após a criação ou a imagem ser refeita. A extensão de script personalizado será executada antes que a extensão do agente do Azure Pipelines seja executada.

Aqui está um exemplo para criar uma extensão de script personalizado para Linux.

az vmss extension set \
--vmss-name <scaleset name> \
--resource-group <resource group> \
--name CustomScript \
--version 2.0 \
--publisher Microsoft.Azure.Extensions \
--settings '{ \"fileUris\":[\"https://<myGitHubRepoUrl>/myScript.sh\"], \"commandToExecute\": \"bash ./myScript.sh /myArgs \" }'

Aqui está um exemplo para criar uma extensão de script personalizado para Windows.

az vmss extension set \
--vmss-name <scaleset name> \
--resource-group <resource group> \
--name CustomScriptExtension \
--version 1.9 \
--publisher Microsoft.Compute \
--settings '{ \"FileUris\":[\"https://<myGitHubRepoUrl>/myscript.ps1\"], \"commandToExecute\": \"Powershell.exe -ExecutionPolicy Unrestricted -File myscript.ps1 -myargs 0 \" }'

Importante

Os scripts executados na Extensão de Script Personalizado devem retornar com o código de saída 0 para que a VM conclua o processo de criação da VM. Se a extensão de script personalizado gerar uma exceção ou retornar um código de saída diferente de zero, a extensão do Azure Pipeline não será executada e a VM não será registrada no pool de agentes do Azure DevOps.

Sua extensão pode ser executada antes que todos os recursos de VM sejam provisionados. Nesse caso, você verá um erro semelhante a "falha na instalação de pré-requisitos básicos". Isso pode ser corrigido adicionando um comando sleep no início do script, por exemplo, sleep 30.

Ciclo de vida de um agente de conjunto de dimensionamento

Aqui está o fluxo de operações para um Agente do Conjunto de Dimensionamento de Máquinas Virtuais do Azure Pipelines

  1. O trabalho de dimensionamento do Pool de Agentes do Conjunto de Dimensionamento do Azure DevOps determina que o pool tem poucos agentes ociosos e precisa escalar horizontalmente. O Azure Pipelines faz uma chamada aos Conjuntos de Dimensionamento do Azure para aumentar a capacidade do conjunto de dimensionamento.

  2. O Conjunto de Dimensionamento do Azure começa a criar as novas máquinas virtuais. Depois que as máquinas virtuais estiverem em execução, os Conjuntos de Dimensionamento do Azure executarão sequencialmente todas as extensões de VM instaladas.

  3. Se a Extensão de Script Personalizado estiver instalada, ela será executada antes da extensão do Agente do Azure Pipelines. Se a Extensão de Script Personalizado retornar um código de saída diferente de zero, o processo de criação da VM será anulado e excluído.

  4. A extensão do Agente do Azure Pipelines é executada. Essa extensão baixa a versão mais recente do Agente do Azure Pipelines junto com a versão mais recente do script de configuração. Os scripts de configuração podem ser encontrados em URLs com os seguintes formatos:

    • Linux: https://vstsagenttools.blob.core.windows.net/tools/ElasticPools/Linux/<script_version>/enableagent.sh, por exemplo, versão 15
    • Windows: https://vstsagenttools.blob.core.windows.net/tools/ElasticPools/Windows/<script_version>/enableagent.ps1, por exemplo, versão 17
  5. O script de configuração cria um usuário local chamado AzDevOps se o sistema operacional for Windows Server ou Linux. Para o sistema operacional cliente Windows 10, o agente é executado como LocalSystem. Em seguida, o script descompacta, instala e configura o Agente do Azure Pipelines. Como parte da configuração, o agente registra com o pool de agentes do Azure DevOps e aparece na lista de pools de agentes no estado Offline.

  6. Na maioria dos cenários, o script de configuração inicia imediatamente o agente para ser executado como o usuário local AzDevOps. O agente fica Online e está pronto para executar trabalhos de pipeline.

    Se o pool estiver configurado para interface do usuário interativa, a máquina virtual será reinicializada depois que o agente for configurado. Após a reinicialização, o usuário local faz logon automaticamente e o agente de pipelines é iniciado. Em seguida, o agente fica online e está pronto para executar trabalhos de pipeline.

Criar um conjunto de dimensionamento com imagem, software ou tamanho de disco personalizado

Se você quiser apenas criar um conjunto de dimensionamento com o disco do sistema operacional padrão de 128 GB usando uma imagem do Azure disponível publicamente, pule diretamente para a etapa 10 e use o nome da imagem pública (UbuntuLTS, Win2019DataCenter etc.) para criar o conjunto de dimensionamento. Caso contrário, siga estas etapas para personalizar sua imagem de VM.

  1. Crie uma VM com a imagem do sistema operacional desejada e, opcionalmente, expanda o tamanho do disco do sistema operacional de 128 GB para <myDiskSizeGb>.

    • Se estiver começando com uma imagem do Azure disponível, por exemplo <, myBaseImage> = (Win2019DataCenter, UbuntuLTS):

      az vm create --resource-group <myResourceGroup> --name <MyVM> --image <myBaseImage> --os-disk-size-gb <myDiskSize>  --admin-username myUserName --admin-password myPassword
      
    • Se estiver começando com um VHD generalizado:

      1. Primeiro, crie a VM com um disco não gerenciado do tamanho desejado e, em seguida, converta em um disco gerenciado:

        az vm create --resource-group <myResourceGroup> --name <MyVM> --image <myVhdUrl> --os-type windows --os-disk-size-gb <myDiskSizeGb> --use-unmanaged-disk --admin-username <myUserName> --admin-password <myPassword> --storage-account <myVhdStorageAccount>
        
      2. Desligar a VM

        az vm stop --resource-group <myResourceGroup> --name <MyVM>
        
      3. Desalocar a VM

        az vm deallocate --resource-group <myResourceGroup> --name <MyVM>
        
      4. Converter em um disco gerenciado

        az vm convert --resource-group <myResourceGroup> --name <MyVM>
        
      5. Reinicie a VM

        az vm start --resource-group <myResourceGroup> --name <MyVM>
        
  2. Área de Trabalho Remota (ou SSH) para o endereço IP público da VM para personalizar a imagem. Talvez seja necessário abrir portas no firewall para desbloquear as portas RDP (3389) ou SSH (22).

    1. Windows – se <MyDiskSizeGb> for maior que 128 GB, estenda o tamanho do disco do sistema operacional para preencher o tamanho do disco especificado por <MyDiskSizeGb>.

      Abra a ferramenta DiskPart como administrador e execute estes comandos DiskPart:

      1. list volume (para ver os volumes)
      2. select volume 2 (depende de qual volume é a unidade do sistema operacional)
      3. extend size 72000 (para estender a unidade em 72 GB, de 128 GB para 200 GB)
  3. Instale qualquer software adicional desejado na VM.

  4. Para personalizar as permissões do usuário do agente de pipeline, você pode criar um usuário chamado AzDevOps e conceder a esse usuário as permissões necessárias. Esse usuário será criado pelo script de inicialização do agente de conjunto de dimensionamento se ainda não existir.

  5. Reinicializar a VM quando terminar com personalizações

  6. Generalize a VM.

    • Windows – de uma janela do console de administração:
      C:\Windows\System32\sysprep\sysprep.exe /generalize /oobe /shutdown
      
    • Linux:
      sudo waagent -deprovision+user -force
      

    Importante

    Aguarde até que a VM conclua a generalização e o desligamento. Não prossiga até que a VM seja interrompida. Aguarde 60 minutos.

  7. Desalocar a VM

    az vm deallocate --resource-group <myResourceGroup> --name <MyVM>
    
  8. Marque a VM como Generalizada

    az vm generalize --resource-group <myResourceGroup> --name <MyVM>
    
  9. Crie uma Imagem da VM baseada na imagem generalizada. Ao executar essas etapas para atualizar uma imagem do conjunto de dimensionamento existente, anote a URL da ID da imagem na saída.

    az image create  --resource-group <myResourceGroup> --name <MyImage> --source <MyVM>
    
  10. Criar o conjunto de dimensionamento com base na imagem de VM personalizada

    az vmss create --resource-group <myResourceGroup> --name <myScaleSet> --image <MyImage> --admin-username <myUsername> --admin-password <myPassword> --instance-count 2 --disable-overprovision --upgrade-policy-mode manual --load-balancer '""'
    
  11. Verifique se ambas as VMs criadas no conjunto de dimensionamento estão online, têm nomes diferentes e atingem o estado Êxito

Agora você está pronto para criar um pool de agentes usando esse conjunto de dimensionamento.

Atualizar um conjunto de dimensionamento existente com uma nova imagem personalizada

Para atualizar a imagem em um conjunto de dimensionamento existente, siga as etapas na seção anterior Criar um conjunto de dimensionamento com imagem personalizada, software ou tamanho de disco até a etapa az image create para gerar a imagem personalizada do sistema operacional. Anote a URL da propriedade ID que é a saída do comando az image create. Em seguida, atualize o conjunto de dimensionamento com a nova imagem, conforme mostrado no exemplo a seguir. Depois que a imagem do conjunto de dimensionamento for atualizada, todas as VMs futuras no conjunto de dimensionamento serão criadas com a nova imagem.

az vmss update --resource-group <myResourceGroup> --name <myScaleSet> --set virtualMachineProfile.storageProfile.imageReference.id=<id url>

Sistemas operacionais compatíveis

Atualmente, os agentes do conjunto de dimensionamento dão suporte ao Ubuntu Linux, ao Windows Server/DataCenter 2016/2019 e ao cliente Windows 10.

Problemas conhecidos

  • Não há suporte para distribuições Dobian ou RedHat Linux. Somente para Ubuntu.
  • O cliente do Windows 10 não dá suporte à execução do agente de pipeline como um usuário loca e, portanto, o agente não pode interagir com a interface do usuário. Em vez disso, o agente será executado como Serviço Local.

Solução de problemas

Acesse as Configurações do projeto do Azure DevOps, selecione Pools de agentes em Pipelines e selecione seu pool de agentes. Selecione a guia rotulada Diagnóstico.

A guia Diagnóstico mostra todas as ações executadas pelo Azure DevOps para criar, excluir ou refazer imagem de VMs em seu Conjunto de Dimensionamento do Azure. O diagnóstico também registra todos os erros encontrados ao tentar executar essas ações. Examine os erros para garantir que seu conjunto de dimensionamento tenha recursos suficientes para escalar horizontalmente. Se sua assinatura do Azure atingiu o limite de recursos em VMs, núcleos de CPU, discos ou endereços IP, esses erros aparecerão aqui.

Agentes não íntegros

Quando agentes ou máquinas virtuais falham ao iniciar, não se conectan ao Azure DevOps ou ficam offline inesperadamente, o Azure DevOps registra as falhas na guia Diagnóstico do Pool de Agentes e tenta excluir a máquina virtual associada. A configuração de rede, a personalização de imagens e as reinicializações pendentes podem causar esses problemas. Conectar-se à VM para depurar e coletar logs pode ajudar na investigação.

Se você quiser que o Azure DevOps salve uma VM do agente não íntegro para investigação e não a exclua automaticamente quando detectar o estado não íntegro, acesse as Configurações do projeto do Azure DevOps, selecione Pools de agentes em Pipelines e selecione o pool de agentes. Escolha Configurações, selecione a opção Salvar um agente não íntegro para investigação e escolha Salvar.

Save unhealthy agent setting.

Agora, quando um agente não íntegro é detectado no conjunto de dimensionamento, o Azure DevOps salva esse agente e a máquina virtual associada. O agente salvo ficará visível na guia Diagnóstico da interface do usuário do pool de agentes. Acesse as Configurações do projeto do Azure DevOps, selecione Pools de agentes em Pipelines, selecione seu pool de agentes, escolha Diagnóstico e anote o nome do agente.

Saved agents card.

Localize a máquina virtual associada em seu Conjunto de Dimensionamento de Máquinas Virtuais do Azure por meio do portal do Azure, na lista Instâncias.

Azure portal Virtual Machine Scale Set instances.

Selecione a instância, escolha Conectar e execute sua investigação.

Connect to virtual machine instance.

Para excluir o agente salvo quando terminar a investigação, acesse as Configurações do projeto do Azure DevOps, selecione Pools de agentes em Pipelines e selecione o pool de agentes. Escolha a guia rotulada Diagnóstico. Localize o agente no cartão Agentes salvos para investigação e escolha Excluir. Isso remove o agente do pool e exclui a máquina virtual associada.

Saved agents card delete button.

Perguntas frequentes

Onde posso encontrar as imagens usadas para agentes hospedados pela Microsoft?

As considerações sobre licenciamento nos limitam a distribuir imagens hospedadas pela Microsoft. Não é possível fornecer essas imagens para uso em seus agentes do conjunto de dimensionamento. Mas, os scripts que usamos para gerar essas imagens são de código aberto. Você pode usar esses scripts e criar suas próprias imagens personalizadas.

Como configurar agentes do conjunto de dimensionamento para executar testes de interface do usuário?

Crie um Conjunto de Dimensionamento com um sistema operacional Windows Server e, ao criar o Pool de Agentes, selecione a opção "Configurar VMs para executar testes interativos".

Como excluir agentes?

` Acesse as Configurações do projeto do Azure DevOps, selecione Pools de agentes em Pipelines e selecione seu pool de agentes. Selecione a guia rotulada Agentes. Clique no botão de alternância "Habilitado" para desabilitar o agente. O agente desabilitado concluirá o pipeline em execução no momento e não obterá trabalho adicional. Em poucos minutos após a conclusão do trabalho de pipeline atual, o agente será excluído.

Posso configurar o pool de agentes do conjunto de dimensionamento para não ter agentes em espera?

Sim, se você definir o Número de agentes a serem mantidos em espera como zero, por exemplo, para conservar o custo de um baixo volume de trabalhos, o Azure Pipelines inicia uma VM somente quando tiver um trabalho.

Quanto custam os agentes do conjunto de dimensionamento?

Os preços dos agentes do conjunto de dimensionamento são semelhantes a outros agentes auto-hospedados. Você fornece a infraestrutura para executar o software do agente e os trabalhos e paga pelo número desejado de trabalhos que podem ser executados simultaneamente comprando trabalhos paralelos.

Para agentes do conjunto de dimensionamento, a infraestrutura para executar o software e os trabalhos do agente é Conjuntos de Dimensionamento de Máquinas Virtuais do Azure e o preço está descrito em Preços dos Conjuntos de Dimensionamento de Máquinas Virtuais.

Para obter informações sobre como comprar trabalhos paralelos, consulte Configurar e pagar por trabalhos paralelos.

Quais são os problemas comuns e suas soluções?

Você observa mais agentes ociosos do que o desejado em diversos momentos

Para entender melhor por que isso acontece, confira Como o Azure Pipelines gerencia o conjunto de dimensionamento. Ao longo da operação de dimensionamento, a meta do Azure Pipelines é alcançar o número desejado de agentes ociosos em espera. Os pools são escalados e reduzidos horizontalmente de forma lenta. Ao longo de um dia, o pool será escalado horizontalmente à medida que as solicitações forem enfileiradas pela manhã e reduzidos horizontalmente à medida que a carga diminuir à noite. Esse é um comportamento esperado, pois o Azure Pipelines converge gradualmente para as restrições especificadas.

O VMSS não está escalando verticalmente no intervalo esperado de cinco minutos

O trabalho de dimensionamento é executado a cada cinco minutos, mas se apenas uma operação for processada, você poderá observar que a escala vertical não está acontecendo dentro de cinco minutos; atualmente, isso ocorre intencionalmente.

O Conjunto de Dimensionamento de VMs Linux do Azure DevOps frequentemente falha ao iniciar o pipeline

Ao enfrentar problemas com agentes do conjunto de dimensionamento, consulte primeiro a guia Diagnóstico no pool de agentes.

Além disso, considere salvar a VM não íntegra para fins de depuração. Para obter mais informações, consulte Agentes não íntegros.

Os agentes salvos estão lá, a menos que você os exclua. Se o agente não ficar online em 10 minutos, ele será marcado como não íntegro e salvo, se possível. Somente uma VM é mantida em um estado salvo. Se o agente ficar offline inesperadamente (devido a uma reinicialização da VM ou algo acontecendo com a imagem), ele não será salvo para investigação.

Somente as VMs para as quais os agentes não iniciam são salvas. Se uma VM tiver um estado com falha durante a criação, ela não será salva. Nesse caso, a mensagem na guia Diagnóstico será "excluindo computador não íntegro" em vez de "falha ao iniciar".

Você marca a opção para desativar automaticamente as máquinas virtuais após cada uso para o pool de agentes, mas você vê que as imagens das VMs não são refeitas como deveriam e apenas pegam novos trabalhos à medida que entram na fila

A opção de desativar a VM após cada build funcionará apenas para o Windows Server e imagens do Linux com suporte. Não há suporte para ele em imagens de cliente do Windows.

O VMSS mostrará o agente como offline se a VM for reiniciada

Mostrar os agentes como offline se a VM for reiniciada é o comportamento esperado. O serviço do agente é executado somente no contexto do sistema. No entanto, se o computador for reiniciado por algum motivo, ele será considerado uma VM não íntegra e excluído. Para obter mais informações, consulte Agentes não íntegros.

Quando agentes ou máquinas virtuais falham ao iniciar, não é possível se conectar ao Azure DevOps ou ficar offline inesperadamente, o Azure DevOps registra as falhas na guia Diagnóstico do Pool de Agentes e tenta excluir a máquina virtual associada. A configuração de rede, a personalização de imagens e as reinicializações pendentes podem causar esses problemas. Para evitar o problema, desabilite a atualização de software na imagem. Você também pode se conectar à VM para depurar e coletar logs para ajudar a investigar o problema.

Você pode ver várias marcas como _AzureDevOpsElasticPoolTimeStamp para VMSS no gerenciamento de custos

Quando o pool é criado, uma marca é adicionada ao conjunto de dimensionamento para marcar o conjunto de dimensionamento como em uso (para evitar que dois pools usem o mesmo conjunto de dimensionamento) e outra marca é adicionada ao carimbo de data/hora que é atualizado sempre que o trabalho de configuração é executado (a cada duas horas).

Não é possível criar um novo pool de agentes do conjunto de dimensionamento e receber uma mensagem de erro informando que já existe um pool com o mesmo nome

Você pode receber uma mensagem de erro como This virtual machine scale set is already in use by pool <pool name> porque a marca ainda existe no conjunto de dimensionamento mesmo depois de ser excluída. Quando um pool de agentes é excluído, você tenta excluir a marca do conjunto de dimensionamento, mas essa é uma tentativa com base no melhor esforço e você desiste após três tentativas. Além disso, pode haver um intervalo máximo de duas horas, no qual um Conjunto de Dimensionamento de Máquinas Virtuais que não é usado por nenhum pool de agentes não pode ser atribuído a um novo. A correção para isso é aguardar a passagem desse intervalo de tempo ou excluir manualmente a marca para o conjunto de dimensionamento do portal do Azure. Ao exibir o conjunto de dimensionamento no portal do Azure, selecione o link Marcas à esquerda e exclua a marca rotulada _AzureDevOpsElasticPool.

O trabalho de manutenção do VMSS não está em execução em agentes nem obtendo logs

O trabalho de manutenção é executado a cada 24 horas. É possível que as VMs estejam sendo preenchidas antes desse prazo. Considere aumentar o tamanho do disco na VM e adicionar um script no pipeline para excluir o conteúdo.

Se você especificar AzDevOps como o administrador primário em seu script para VMSS, você poderá observar problemas com as configurações do agente em instâncias do conjunto de dimensionamento

Se você especificar o AzDevOps como o administrador primário em seu script para o Conjunto de Dimensionamento de Máquinas Virtuais, você poderá observar problemas com as configurações do agente em instâncias do conjunto de dimensionamento (a senha do usuário será alterada, caso já exista).

Esse problema ocorre porque os scripts de extensão do agente tentam criar o usuário do AzDevOps e alterar a senha.

Observação

Não há problema em criar o usuário e conceder permissões extras, mas ele não deve ser o administrador primário e nada deve depender da senha, pois a senha será alterada. Para evitar o problema, escolha um usuário diferente como o administrador primário ao criar o conjunto de dimensionamento, em vez do AzDevOps.

A instalação da extensão do agente falha nas instâncias do conjunto de dimensionamento devido à segurança de rede e às configurações de firewall

A extensão precisa ser capaz de baixar os arquivos do agente de build de https://vstsagentpackage.azureedge.net/agent e o agente de build precisa ser capaz de se registrar no Azure DevOps Services. Verifique se essa URL e os IPs e URLs relacionados ao Azure DevOps Services estão abertos na instância. Para IPs e URLs que precisam ser desbloqueados no firewall, consulte Endereços IP permitidos e URLs de domínio.

Por que meu script de configuração do agente do conjunto de dimensionamento chama Add-MpPreference e configura o Windows Defender no agente?

Para melhorar o desempenho e a confiabilidade, os scripts de configuração chamam Add-MpPreference com um ExclusionPath contendo C:\ e D:\, que desabilita a verificação agendada e em tempo real do Windows Defender para arquivos nessas pastas no agente. Para alterar o comportamento padrão, defina uma variável de ambiente nomeada ELASTIC_POOLS_SKIP_DEFENDER_EXCLUSION como true.

Quero aumentar o tamanho do pool. O que devo levar em consideração?

Antes de aumentar o tamanho do pool, verifique se a Rede Virtual do Azure configurada para o pool de Conjuntos de Dimensionamento de Máquinas Virtuais tem um intervalo de Espaço de endereço grande o suficiente para acomodar todos os novos agentes. Caso contrário, você poderá receber um erro semelhante a Falha ao aumentar a capacidade. A sub-rede azure-devops-agent-pool-fabrikam-fiber com o prefixo de endereço 12.123.45.224/28 não tem capacidade suficiente para 5 endereços IP.