Integrar modelos do Resource Manager com Pipelines do Azure

Pode integrar modelos do Azure Resource Manager (modelos arm) nos Pipelines do Azure para integração contínua e implementação contínua (CI/CD). Neste artigo, irá aprender duas formas mais avançadas de implementar modelos com o Azure Pipelines.

Selecione a sua opção

Antes de continuar com este artigo, vamos considerar as diferentes opções para implementar um modelo do ARM a partir de um pipeline.

  • Utilize a tarefa de implementação de modelos do ARM. Esta opção é a opção mais fácil. Esta abordagem funciona quando pretende implementar um modelo diretamente a partir de um repositório. Esta opção não é abrangida neste artigo, mas é abordada no tutorial Integração contínua de modelos do ARM com o Azure Pipelines. Mostra como utilizar a tarefa de implementação de modelos do ARM para implementar um modelo a partir do seu repositório do GitHub.

  • Adicionar tarefa que executa um script de Azure PowerShell. Esta opção tem a vantagem de fornecer consistência ao longo do ciclo de vida de desenvolvimento, uma vez que pode utilizar o mesmo script que utilizou ao executar testes locais. O script implementa o modelo, mas também pode realizar outras operações, como obter valores para utilizar como parâmetros. Esta opção é apresentada neste artigo. Veja Azure PowerShell tarefa.

    O Visual Studio fornece o projeto do Grupo de Recursos do Azure que inclui um script do PowerShell. O script prepara artefactos do projeto para uma conta de armazenamento à qual Resource Manager pode aceder. Os artefactos são itens no seu projeto, como modelos ligados, scripts e binários de aplicações. Se quiser continuar a utilizar o script do projeto, utilize a tarefa de script do PowerShell apresentada neste artigo.

  • Adicione tarefas para copiar e implementar tarefas. Esta opção oferece uma alternativa conveniente ao script do projeto. Pode configurar duas tarefas no pipeline. Uma tarefa prepara os artefactos para uma localização acessível. A outra tarefa implementa o modelo a partir dessa localização. Esta opção é apresentada neste artigo. Veja Copiar e implementar tarefas.

Preparar o projeto

Este artigo pressupõe que o modelo arm e a organização do Azure DevOps estão prontos para criar o pipeline. Os passos seguintes mostram como se certificar de que está pronto:

  • Tem uma organização do Azure DevOps. Se não tiver uma, crie uma gratuitamente. Se a sua equipa já tiver uma organização do Azure DevOps, certifique-se de que é um administrador do projeto do Azure DevOps que pretende utilizar.

  • Configurou uma ligação de serviço à sua subscrição do Azure. As tarefas no pipeline são executadas sob a identidade do principal de serviço. Para obter os passos para criar a ligação, veja Criar um projeto de DevOps.

  • Tem um modelo do ARM que define a infraestrutura para o seu projeto.

Criar pipeline

  1. Se ainda não adicionou um pipeline, tem de criar um novo pipeline. Na sua organização do Azure DevOps, selecione Pipelines e Novo pipeline.

    Captura de ecrã a mostrar o botão Adicionar novo pipeline

  2. Especifique onde o código está armazenado. A imagem seguinte mostra a seleção do Git de Repositórios do Azure.

    Captura de ecrã a mostrar a seleção da origem de código no Azure DevOps

  3. Nessa origem, selecione o repositório que tem o código para o projeto.

    Captura de ecrã a mostrar a seleção do repositório do projeto no Azure DevOps

  4. Selecione o tipo de pipeline a criar. Pode selecionar Pipeline de arranque.

    Captura de ecrã a mostrar a seleção do tipo de pipeline a criar no Azure DevOps

Está pronto para adicionar uma tarefa Azure PowerShell ou o ficheiro de cópia e implementar tarefas.

Tarefa do Azure PowerShell

Esta secção mostra como configurar a implementação contínua com uma única tarefa que executa o script do PowerShell no seu projeto. Se precisar de um script do PowerShell que implemente um modelo, consulte Deploy-AzTemplate.ps1 ou Deploy-AzureResourceGroup.ps1.

O seguinte ficheiro YAML cria uma tarefa Azure PowerShell:

trigger:
- master

pool:
  vmImage: 'ubuntu-latest'

steps:
- task: AzurePowerShell@5
  inputs:
    azureSubscription: 'script-connection'
    ScriptType: 'FilePath'
    ScriptPath: './Deploy-AzTemplate.ps1'
    ScriptArguments: -Location 'centralus' -ResourceGroupName 'demogroup' -TemplateFile templates\mainTemplate.json
    azurePowerShellVersion: 'LatestVersion'

Quando define a tarefa como AzurePowerShell@5, o pipeline utiliza o módulo Az. Se estiver a utilizar o módulo AzureRM no script, defina a tarefa como AzurePowerShell@3.

steps:
- task: AzurePowerShell@3

Para azureSubscription, indique o nome da ligação de serviço que criou.

inputs:
    azureSubscription: '<your-connection-name>'

Para scriptPath, forneça o caminho relativo do ficheiro de pipeline para o script. Pode procurar no seu repositório para ver o caminho.

ScriptPath: '<your-relative-path>/<script-file-name>.ps1'

No ScriptArguments, forneça todos os parâmetros necessários para o script. O exemplo seguinte mostra alguns parâmetros para um script, mas terá de personalizar os parâmetros do script.

ScriptArguments: -Location 'centralus' -ResourceGroupName 'demogroup' -TemplateFile templates\mainTemplate.json

Quando seleciona Guardar, o pipeline de compilação é executado automaticamente. Voltar ao resumo do pipeline de compilação e watch o estado.

Captura de ecrã da vista de resultados do pipeline no Azure DevOps

Pode selecionar o pipeline atualmente em execução para ver detalhes sobre as tarefas. Quando terminar, verá os resultados de cada passo.

Copiar e implementar tarefas

Esta secção mostra como configurar a implementação contínua com duas tarefas. A primeira tarefa prepara os artefactos para uma conta de armazenamento e a segunda tarefa implementa o modelo.

Para copiar ficheiros para uma conta de armazenamento, o principal de serviço da ligação de serviço tem de ser atribuído à função Contribuidor de Dados de Blobs de Armazenamento ou Proprietário de Dados de Blobs de Armazenamento. Para obter mais informações, veja Introdução ao AzCopy.

O YAML seguinte mostra a tarefa de cópia de ficheiros do Azure.

trigger:
- master

pool:
  vmImage: 'windows-latest'

steps:
- task: AzureFileCopy@4
  inputs:
    SourcePath: 'templates'
    azureSubscription: 'copy-connection'
    Destination: 'AzureBlob'
    storage: 'demostorage'
    ContainerName: 'projecttemplates'
  name: AzureFileCopy

Existem várias partes desta tarefa a rever para o seu ambiente. Indica SourcePath a localização dos artefactos relativamente ao ficheiro de pipeline.

SourcePath: '<path-to-artifacts>'

Para azureSubscription, indique o nome da ligação de serviço que criou.

azureSubscription: '<your-connection-name>'

Para o nome do contentor e do armazenamento, forneça os nomes da conta de armazenamento e do contentor que pretende utilizar para armazenar os artefactos. A conta de armazenamento tem de existir.

storage: '<your-storage-account-name>'
ContainerName: '<container-name>'

Depois de criar a tarefa copiar ficheiro, está pronto para adicionar a tarefa para implementar o modelo faseado.

O YAML seguinte mostra a tarefa de implementação do modelo do Azure Resource Manager:

- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    deploymentScope: 'Resource Group'
    azureResourceManagerConnection: 'copy-connection'
    subscriptionId: '00000000-0000-0000-0000-000000000000'
    action: 'Create Or Update Resource Group'
    resourceGroupName: 'demogroup'
    location: 'West US'
    templateLocation: 'URL of the file'
    csmFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.json$(AzureFileCopy.StorageContainerSasToken)'
    csmParametersFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.parameters.json$(AzureFileCopy.StorageContainerSasToken)'
    deploymentMode: 'Incremental'
    deploymentName: 'deploy1'

Existem várias partes desta tarefa a rever mais detalhadamente.

  • deploymentScope: selecione o âmbito da implementação nas opções: Management Group, Subscriptione Resource Group. Para saber mais sobre os âmbitos, veja Âmbitos de implementação.

  • azureResourceManagerConnection: indique o nome da ligação de serviço que criou.

  • subscriptionId: Indique o ID da subscrição de destino. Esta propriedade aplica-se apenas ao âmbito de implementação do Grupo de Recursos e ao âmbito de implementação da subscrição.

  • resourceGroupName e location: indique o nome e a localização do grupo de recursos no qual pretende implementar. A tarefa cria o grupo de recursos se não existir.

    resourceGroupName: '<resource-group-name>'
    location: '<location>'
    
  • csmFileLink: forneça a ligação para o modelo faseado. Ao definir o valor, utilize as variáveis devolvidas da tarefa de cópia de ficheiro. O exemplo seguinte liga a um modelo com o nome mainTemplate.json. A pasta com o nome modelos está incluída porque a tarefa de cópia do ficheiro copiou o ficheiro para. No seu pipeline, forneça o caminho para o modelo e o nome do modelo.

    csmFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.json$(AzureFileCopy.StorageContainerSasToken)'
    

O seu pipeline tem o seguinte aspeto:

trigger:
- master

pool:
  vmImage: 'windows-latest'

steps:
- task: AzureFileCopy@4
  inputs:
    SourcePath: 'templates'
    azureSubscription: 'copy-connection'
    Destination: 'AzureBlob'
    storage: 'demostorage'
    ContainerName: 'projecttemplates'
  name: AzureFileCopy
- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    deploymentScope: 'Resource Group'
    azureResourceManagerConnection: 'copy-connection'
    subscriptionId: '00000000-0000-0000-0000-000000000000'
    action: 'Create Or Update Resource Group'
    resourceGroupName: 'demogroup'
    location: 'West US'
    templateLocation: 'URL of the file'
    csmFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.json$(AzureFileCopy.StorageContainerSasToken)'
    csmParametersFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.parameters.json$(AzureFileCopy.StorageContainerSasToken)'
    deploymentMode: 'Incremental'
    deploymentName: 'deploy1'

Quando seleciona Guardar, o pipeline de compilação é executado automaticamente. Na moldura Tarefas , selecione Tarefa para ver o estado da tarefa.

Passos seguintes