Tarefa de DevOps do serviço Construtor de Imagens de VM do Azure (versão prévia)

Aplica-se a: ✔️ VMs do Linux ✔️ Conjuntos de dimensionamento flexíveis

Neste artigo, você aprenderá a usar uma tarefa do Azure DevOps para injetar artefatos de compilação em uma imagem de VM (máquina virtual) com o objetivo de instalar e configurar seu aplicativo e sistema operacional.

Versões de tarefa do DevOps

Neste momento, há duas tarefas de DevOps do Construtor de Imagens de VM do Azure:

Pré-requisitos

Observação

No momento, a tarefa do Construtor de Imagens de VM não dá suporte à reinicialização do Windows ou à execução de comandos elevados como administrador. Ou seja, a tarefa não é adequada para cenários da Área de Trabalho Virtual do Azure ou personalizações do Windows que exigem esses recursos. Para usar DevOps com o Construtor de Imagens de VM, aninhe o modelo em uma tarefa do Azure Resource Manager e use as tarefas da CLI do Azure ou do PowerShell.

Antes de começar, faça o seguinte:

  • Instale a tarefa de DevOps Estável no Visual Studio Marketplace.

  • Tenha uma conta do Azure DevOps Services (antigo Visual Studio Team Services ou VSTS) e um pipeline de build criado.

  • Registre e habilite os requisitos de recurso do Construtor de Imagens de VM na assinatura usada pelos pipelines:

  • Crie uma conta de armazenamento padrão do Azure no grupo de recursos de imagem de origem. É possível usar outros grupos de recursos ou contas de armazenamento. A conta de armazenamento é usada para transferir os artefatos de compilação da tarefa DevOps para a imagem.

    # Azure PowerShell
    $timeInt=$(get-date -UFormat "%s")
    $storageAccName="aibstorage"+$timeInt
    $location=westus
    # Create a storage account and blob in the resource group
    New-AzStorageAccount -ResourceGroupName $strResourceGroup -Name $storageAccName -Location $location -SkuName Standard_LRS
    
    # The Azure CLI
    location=westus
    scriptStorageAcc=aibstordot$(date +'%s')
    # Create a storage account and blob in the resource group
    az storage account create -n $scriptStorageAcc -g $strResourceGroup -l $location --sku Standard_LRS
    

Adicionar uma tarefa ao pipeline de lançamento

  1. Selecione Pipeline de lançamento>Editar.

  2. No agente de usuário, clique no sinal de mais (+) para adicionar e pesquisar o Construtor de Imagens.

  3. Selecione Adicionar.

Nas seções a seguir, defina as propriedades da tarefa.

Assinatura do Azure

Na lista suspensa, selecione a assinatura que o Construtor de Imagens de VM executará. Use a assinatura em que suas imagens de origem estão armazenadas e na qual as imagens serão distribuídas. É necessário conceder o acesso de colaborador do Construtor de Imagens de VM à assinatura ou ao grupo de recursos.

Resource group

Use o grupo de recursos onde o artefato do modelo de imagem temporária será armazenado. Ao criar um artefato de modelo, outro grupo de recursos temporário do Construtor de Imagens de VM é criado: IT_<DestinationResourceGroup>_<TemplateName>_guid. O grupo de recursos temporários armazena os metadados da imagem, como scripts. No final da tarefa, o artefato do modelo de imagem e o grupo de recursos temporário do Construtor de Imagens de VM são excluídos.

Location

O local é a região em que o Construtor de Imagens de VM será executado. Há suporte apenas para um número definido de regiões. As imagens de origem devem estar presentes neste local. Por exemplo, ao usar a Galeria de Computação do Azure (antiga Galeria de Imagens Compartilhadas), uma réplica deve existir nessa região.

Identidade gerenciada (obrigatória)

O Construtor de Imagens de VM requer uma identidade gerenciada, que ele usa para ler imagens personalizadas de origem, conectar-se ao Armazenamento do Azure e criar imagens personalizadas. Para saber mais, confira Saiba mais sobre o Construtor de Imagens de VM.

Suporte de rede virtual

É possível configurar a VM criada para estar em uma rede virtual específica. Ao configurar a tarefa, forneça a ID do recurso de uma sub-rede pré-existente no campo de entrada Configuração de VNet (opcional). Omita a ID do recurso se nenhuma rede virtual específica precisar ser usada. Para saber mais, confira Opções de rede do serviço do Construtor de Imagens de VM do Azure.

Fonte

As imagens de origem devem ser dos sistemas operacionais do Construtor de Imagens de VM com suporte. É possível escolher imagens personalizadas existentes na mesma região em que o Construtor de Imagens de VM está sendo executado:

  • Imagem gerenciada: transmita a ID do recurso. Por exemplo:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/images/<imageName>
    
  • Galeria de computação: transmita a ID do recurso da versão de imagem. Por exemplo:

    /subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup/providers/Microsoft.Compute/galleries/$sigName/images/$imageDefName/versions/<versionNumber>
    

    Para obter a versão mais recente da Galeria de Computação, use uma tarefa do Azure PowerShell ou da CLI do Azure e defina uma variável de DevOps. Use a variável na tarefa de DevOps do Construtor de Imagens de VM. Para saber mais, confira os exemplos em Obter a ID do recurso da versão de imagem mais recente.

  • (Marketplace) Imagem base: use a lista suspensa de imagens populares, que sempre usa a versão mais recente dos sistemas operacionais com suporte.

    Se a imagem base exata não estiver na lista, especifique-a usando Publisher:Offer:Sku.

    (Opcional) Versão de imagem base: é possível fornecer a versão da imagem que será usada. A versão padrão é latest.

Personalizar

As seções a seguir discutem as diversas maneiras de personalizar tarefas.

Provisionador

Inicialmente, há suporte para dois personalizadores, Shell e PowerShell. Apenas os embutidos possuem suporte. É possível transmitir comandos embutidos para fazer o download de scripts.

Para o sistema operacional, selecione PowerShell ou Shell.

A tarefa do Windows Update

Somente para Windows, a tarefa é executada no Windows Update no final das personalizações. Ela também lida com as reinicializações necessárias.

A tarefa executa a seguinte configuração do Windows Update:

    "type": "WindowsUpdate",
    "searchCriteria": "IsInstalled=0",
    "filters": [
        "exclude:$_.Title -like '*Preview*'",
        "include:$true"

A tarefa instala atualizações importantes e recomendadas do Windows que não são versões prévias.

Lidando com reinicializações

No momento, a tarefa de DevOps não dá suporte à reinicialização de compilações do Windows. Se você tentar realizar a reinicialização com o código do PowerShell, a compilação falhará. No entanto, você pode usar o código para reinicializar compilações do Linux.

Caminho de compilação

A tarefa foi projetada para ser capaz de injetar artefatos de versão de compilação DevOps na imagem. Para fazer isso funcionar, você precisa configurar um pipeline de build. Na configuração do pipeline de lançamento, adicione o repositório dos artefatos de compilação.

Captura de tela que mostra como adicionar um artefato no pipeline de lançamento.

Clique no botão Caminho de compilação para escolher a pasta de compilação que você deseja colocar na imagem. A tarefa do Construtor de Imagens de VM copia todos os arquivos e diretórios dentro dela. Quando a imagem está sendo criada, o Construtor de Imagens de VM implanta os arquivos e diretórios em diferentes caminhos, dependendo do sistema operacional.

Importante

Ao adicionar um artefato de repositório, o nome do diretório pode estar prefixado com um caractere sublinhado (_). O sublinhado pode causar problemas com os comandos embutidos. Certifique-se de usar as aspas apropriadas nos comandos.

O exemplo a seguir explica como isso funciona:

Captura de tela de uma estrutura de diretórios mostrando a hierarquia.

  • Para Windows: os arquivos estão na unidade C:. O diretório buildArtifacts foi criado e inclui o diretório webapp.

  • Para Linux: os arquivos estão no diretório /tmp. O diretório webapp foi criado e inclui todos os arquivos e diretórios. Como este é um diretório temporário, mova os arquivos para fora dele. Caso contrário, eles serão excluídos.

Script de personalização embutido

  • Para Windows: é possível inserir comandos embutidos do PowerShell, separados por vírgulas. Se você quiser executar um script em seu diretório de build, poderá usar:

    & 'c:\buildArtifacts\webapp\webconfig.ps1'
    

    É possível fazer referência a diversos scripts ou incluir mais comandos. Por exemplo:

    & 'c:\buildArtifacts\webapp\webconfig.ps1'
    & 'c:\buildArtifacts\webapp\installAgent.ps1'
    
  • Para Linux: os artefatos de compilação são colocados no diretório /tmp. No entanto, em muitos sistemas operacionais Linux, o conteúdo do diretório /tmp é excluído durante uma reinicialização. Se você quiser que os artefatos existam na imagem, deverá criar outro diretório e copiá-los. Por exemplo:

    sudo mkdir /lib/buildArtifacts
    sudo cp -r "/tmp/_ImageBuilding/webapp" /lib/buildArtifacts/.
    

    Se o uso do diretório /tmp for adequado para você, execute o script com o seguinte código:

    # Grant execute permissions to run scripts
    sudo chmod +x "/tmp/_ImageBuilding/webapp/coreConfig.sh"
    echo "running script"
    sudo . "/tmp/AppsAndImageBuilderLinux/_WebApp/coreConfig.sh"
    

O que acontece com os artefatos de build após a criação da imagem?

Observação

O Construtor de Imagens de VM não remove automaticamente os artefatos de compilação. Recomenda-se sempre usar o código para remover os artefatos de compilação.

  • Para Windows: o Construtor de Imagens de VM implanta arquivos no diretório C:\buildArtifacts. Como o diretório é persistente, você deve removê-lo executando um script. Por exemplo:

    # Clean up buildArtifacts directory
    Remove-Item -Path "C:\buildArtifacts\*" -Force -Recurse
    
    # Delete the buildArtifacts directory
    Remove-Item -Path "C:\buildArtifacts" -Force 
    
  • Para Linux: os artefatos de compilação são colocados no diretório /tmp. No entanto, em muitos sistemas operacionais Linux, o conteúdo do diretório /tmp é excluído durante a reinicialização. Recomenda-se usar o código para remover o conteúdo, em vez de confiar no sistema operacional para isso. Por exemplo:

    sudo rm -R "/tmp/AppsAndImageBuilderLinux"
    

Comprimento total da compilação da imagem

O comprimento total ainda não pode ser alterado na tarefa do pipeline de DevOps. Ele usa o padrão de 240 minutos. Para aumentar buildTimeoutInMinutes, use uma tarefa da CLI do Azure no pipeline de lançamento. Configure a tarefa para copiar um modelo e enviá-lo. Para obter uma solução de exemplo, confira Usar variáveis de ambiente e parâmetros com o Construtor de Imagens de VM ou use o Azure PowerShell.

Conta de armazenamento

Escolha a conta de armazenamento criada nos pré-requisitos. Se ela não estiver na lista, o Construtor de Imagens de VM não terá permissões para ela.

Quando a compilação é iniciada, o Construtor de Imagens de VM cria o contêiner imagebuilder-vststask para o armazenamento dos artefatos de compilação do repositório.

Observação

Você precisa excluir manualmente a conta de armazenamento ou o contêiner após cada compilação.

Distribuir

Os três tipos de distribuição a seguir tem suporte.

Imagem gerenciada

  • ID do recurso:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/images/<imageName>
    
  • Locais

A Galeria de Computação já deve existir.

  • ID do recurso:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>
    
  • Regiões: uma lista de regiões, separadas por vírgulas. Por exemplo, westus, eastus, centralus.

Disco rígido virtual

Não é possível transmitir nenhum valor para ele. O Construtor de Imagens de VM emite o VHD do disco rígido virtual para o grupo de recursos temporário do Construtor de Imagens de VM, IT_<DestinationResourceGroup>_<TemplateName>, no contêiner vhds. Quando você inicia a compilação de lançamento, o Construtor de Imagens de VM emite logs. Ao final, ele emite a URL do VHD.

Configurações opcionais

É possível substituir a configuração de Tamanho da VM e mudar o tamanho padrão Standard_D1_v2. É possível fazer isso para reduzir o tempo total de personalização. Também é possível criar imagens que dependem de determinados tamanhos de VM, como GPU (unidade de processamento gráfico), HPC (computação de alto desempenho) e assim por diante.

Como a tarefa funciona

Quando você cria a versão, a tarefa cria um contêiner na conta de armazenamento, chamado imagebuilder-vststask. Ele compacta e carrega seus artefatos de compilação e cria um token de assinatura de acesso compartilhado para o arquivo zip.

A tarefa usa as propriedades transmitidas para criar o artefato de modelo do Construtor de Imagens de VM. A tarefa faz o seguinte:

  • Baixa o arquivo zip do artefato de compilação e quaisquer outros scripts associados. Os arquivos são salvos em uma conta de armazenamento no grupo de recursos temporário do Construtor de Imagens de VM IT_<DestinationResourceGroup>_<TemplateName>.

  • Cria um modelo prefixado com t_ e um inteiro monotônico de 10 dígitos. O modelo é salvo no grupo de recursos que você selecionou e existe durante a compilação no grupo de recursos.

Saída de exemplo:

start reading task parameters...
found build at:  /home/vsts/work/r1/a/_ImageBuilding/webapp
end reading parameters
getting storage account details for aibstordot1556933914
created archive /home/vsts/work/_temp/temp_web_package_21475337782320203.zip
Source for image:  { type: 'SharedImageVersion',
  imageVersionId: '/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>/versions/<imgVersionNumber>' }
template name:  t_1556938436xxx
starting put template...

Quando a compilação da imagem é iniciada, o status de execução é relatado nos logs de lançamento:

starting run template...

Quando a compilação da imagem for concluída, a saída será semelhante ao seguinte texto:

2019-05-06T12:49:52.0558229Z starting run template...
2019-05-06T13:36:33.8863094Z run template:  Succeeded
2019-05-06T13:36:33.8867768Z getting runOutput for  SharedImage_distribute
2019-05-06T13:36:34.6652541Z ==============================================================================
2019-05-06T13:36:34.6652925Z ## task output variables ##
2019-05-06T13:36:34.6658728Z $(imageUri) =  /subscriptions/<subscriptionID>/resourceGroups/aibwinsig/providers/Microsoft.Compute/galleries/my22stSIG/images/winWAppimages/versions/0.23760.13763
2019-05-06T13:36:34.6659989Z ==============================================================================
2019-05-06T13:36:34.6663500Z deleting template t_1557146959485...
2019-05-06T13:36:34.6673713Z deleting storage blob imagebuilder-vststask\webapp/18-1/webapp_1557146958741.zip
2019-05-06T13:36:34.9786039Z blob imagebuilder-vststask\webapp/18-1/webapp_1557146958741.zip is deleted
2019-05-06T13:38:37.4884068Z delete template:  Succeeded

O modelo de imagem e IT_<DestinationResourceGroup>_<TemplateName> são excluídos.

É possível usar a variável $(imageUri) do Azure DevOps Services (antigo Visual Studio Team Services ou VSTS) na próxima tarefa ou somente o valor e criar uma VM.

Variáveis de DevOps de saída

Veja a seguir o editor, a oferta, a SKU e a versão da imagem do marketplace de origem:

  • $(pirPublisher)
  • $(pirOffer)
  • $(pirSku)
  • $(pirVersion)

Este é o URI da imagem, que é a ID do recurso da imagem distribuída:

  • $(imageUri)

Perguntas frequentes

É possível usar um modelo de imagem que já criei fora do DevOps?

Não no momento.

Posso especificar o nome do modelo da imagem?

Não. Um nome de modelo exclusivo é usado e, em seguida, excluído.

A tarefa do Construtor de Imagens de VM falhou. Como solucionar o problema?

Se houver uma falha de compilação, a tarefa de DevOps não excluirá o grupo de recursos de preparo. Você pode acessar o grupo de recursos de preparo que contém o log de personalização da compilação.

Você verá um erro no log de DevOps da tarefa do Construtor de Imagens de VM e a mensagem conterá o local de customization.log. Por exemplo:

Captura de tela de um exemplo de erro de tarefa de DevOps que descreve a falha e fornece o local do arquivo customization.log.

Para saber mais, confira Solucionar problemas do serviço Construtor de Imagens de VM.

Depois de investigar a falha, é possível excluir o grupo de recursos de preparo. Primeiro, exclua o artefato do recurso de modelo do Construtor de Imagens de VM. O artefato é prefixado com t_ e pode ser encontrado no log de compilação da tarefa de DevOps:

...
Source for image:  { type: 'SharedImageVersion',
  imageVersionId: '/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>/versions/<imgVersionNumber>' }
...
template name:  t_1556938436xxx
...

O artefato do recurso de modelo do Construtor de Imagens de VM está no grupo de recursos especificado inicialmente na tarefa. Quando terminar a solução de problemas, exclua o artefato. Para excluí-lo com o portal do Azure, no grupo de recursos, selecione Mostrar tipos ocultos para exibir o artefato.

Próximas etapas

Para saber mais, confira a Visão geral do Construtor de Imagens de VM.