Integrare i modelli di Azure Resource Manager con Azure Pipelines

È possibile integrare modelli di Azure Resource Manager (modelli arm) con Azure Pipelines per l'integrazione continua e la distribuzione continua (CI/CD). Questo articolo illustra due modi più avanzati per distribuire modelli con Azure Pipelines.

Selezionare l'opzione

Prima di procedere con questo articolo, si considerino le diverse opzioni per la distribuzione di un modello di Resource Manager da una pipeline.

  • Usare l'attività di distribuzione del modello di Resource Manager. Questa opzione è l'opzione più semplice. Questo approccio funziona quando si vuole distribuire un modello direttamente da un repository. Questa opzione non è descritta in questo articolo, ma è descritta nell'esercitazione Integrazione continua dei modelli di Azure Resource Manager con Azure Pipelines. Illustra come usare l'attività di distribuzione del modello di Resource Manager per distribuire un modello dal repository GitHub.

  • Aggiungere un'attività che esegue uno script Azure PowerShell. Questa opzione offre il vantaggio di garantire coerenza durante tutto il ciclo di vita dello sviluppo, perché è possibile usare lo stesso script usato durante l'esecuzione di test locali. Lo script distribuisce il modello, ma può anche eseguire altre operazioni, ad esempio il recupero di valori da usare come parametri. Questa opzione è illustrata in questo articolo. Vedere Azure PowerShell attività.

    Visual Studio fornisce il progetto gruppo di risorse di Azure che include uno script di PowerShell. Gli elementi dello script vengono fasi dal progetto a un account di archiviazione a cui Resource Manager possibile accedere. Gli artefatti sono elementi nel progetto, ad esempio modelli collegati, script e file binari dell'applicazione. Se si vuole continuare a usare lo script del progetto, usare l'attività script di PowerShell illustrata in questo articolo.

  • Aggiungere attività per copiare e distribuire attività. Questa opzione offre un'alternativa pratica allo script di progetto. Configurare due attività nella pipeline. Un'attività mette in fase gli artefatti in una posizione accessibile. L'altra attività distribuisce il modello da tale posizione. Questa opzione è illustrata in questo articolo. Vedere Copiare e distribuire le attività.

Preparare il progetto

Questo articolo presuppone che il modello di Resource Manager e l'organizzazione Di Azure DevOps siano pronti per la creazione della pipeline. I passaggi seguenti illustrano come assicurarsi di essere pronti:

  • Si ha un'organizzazione di Azure DevOps. Se non è disponibile, crearne uno gratuitamente. Se il team ha già un'organizzazione di Azure DevOps, assicurarsi di essere un amministratore del progetto Azure DevOps che si vuole usare.

  • È stata configurata una connessione al servizio alla sottoscrizione di Azure. Le attività nella pipeline vengono eseguite con l'identità dell'entità servizio. Per la procedura per creare la connessione, vedere Creare un progetto DevOps.

  • Si dispone di un modello di Resource Manager che definisce l'infrastruttura per il progetto.

Creare una pipeline

  1. Se in precedenza non è stata aggiunta una pipeline, è necessario creare una nuova pipeline. Nell'organizzazione di Azure DevOps selezionare Pipeline e Nuova pipeline.

    Screenshot del pulsante Aggiungi nuova pipeline

  2. Specificare dove è archiviato il codice. L'immagine seguente mostra la selezione di Azure Repos Git.

    Screenshot della selezione dell'origine del codice in Azure DevOps

  3. Da tale origine selezionare il repository con il codice per il progetto.

    Screenshot della selezione del repository per il progetto in Azure DevOps

  4. Selezionare il tipo di pipeline da creare. È possibile selezionare Pipeline di avvio.

    Screenshot della selezione del tipo di pipeline da creare in Azure DevOps

È possibile aggiungere un'attività Azure PowerShell o il file di copia e distribuire le attività.

Attività di Azure PowerShell

Questa sezione illustra come configurare la distribuzione continua usando una singola attività che esegue lo script di PowerShell nel progetto. Se è necessario uno script di PowerShell che distribuisce un modello, vedere Deploy-AzTemplate.ps1 o Deploy-AzureResourceGroup.ps1.

Il file YAML seguente crea un'attività 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 si imposta l'attività su AzurePowerShell@5, la pipeline usa il modulo Az. Se si usa il modulo AzureRM nello script, impostare l'attività su AzurePowerShell@3.

steps:
- task: AzurePowerShell@3

Per azureSubscription, specificare il nome della connessione al servizio creata.

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

Per scriptPath, specificare il percorso relativo dal file della pipeline allo script. È possibile cercare nel repository per visualizzare il percorso.

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

In ScriptArgumentsspecificare i parametri necessari per lo script. L'esempio seguente illustra alcuni parametri per uno script, ma è necessario personalizzare i parametri per lo script.

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

Quando si seleziona Salva, la pipeline di compilazione viene eseguita automaticamente. Indietro al riepilogo per la pipeline di compilazione e watch lo stato.

Screenshot della visualizzazione dei risultati della pipeline in Azure DevOps

È possibile selezionare la pipeline attualmente in esecuzione per visualizzare i dettagli sulle attività. Al termine, vengono visualizzati i risultati per ogni passaggio.

Copiare e distribuire attività

Questa sezione illustra come configurare la distribuzione continua usando due attività. La prima attività esegue l'esecuzione delle fasi degli artefatti in un account di archiviazione e la seconda attività distribuisce il modello.

Per copiare i file in un account di archiviazione, all'entità servizio per la connessione del servizio deve essere assegnato il ruolo Collaboratore ai dati del BLOB di archiviazione o Proprietario dei dati del BLOB di archiviazione. Per altre informazioni, vedere Introduzione ad AzCopy.

Il codice YAML seguente mostra l'attività di copia file di 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

Esistono diverse parti di questa attività da rivedere per l'ambiente in uso. Indica SourcePath il percorso degli artefatti rispetto al file della pipeline.

SourcePath: '<path-to-artifacts>'

Per azureSubscription, specificare il nome della connessione al servizio creata.

azureSubscription: '<your-connection-name>'

Per l'archiviazione e il nome del contenitore, specificare i nomi dell'account di archiviazione e del contenitore da usare per l'archiviazione degli artefatti. L'account di archiviazione deve esistere.

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

Dopo aver creato l'attività copia file, è possibile aggiungere l'attività per distribuire il modello a fasi.

Il codice YAML seguente illustra l'attività di distribuzione del modello di 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'

Esistono diverse parti di questa attività da esaminare in modo più dettagliato.

  • deploymentScope: selezionare l'ambito della distribuzione dalle opzioni, Management Group, Subscriptione Resource Group. Per altre informazioni sugli ambiti, vedere Ambiti di distribuzione.

  • azureResourceManagerConnection: specificare il nome della connessione al servizio creata.

  • subscriptionId: specificare l'ID sottoscrizione di destinazione. Questa proprietà si applica solo all'ambito di distribuzione del gruppo di risorse e all'ambito di distribuzione della sottoscrizione.

  • resourceGroupName e location: specificare il nome e la posizione del gruppo di risorse in cui si vuole eseguire la distribuzione. L'attività crea il gruppo di risorse, se non esiste.

    resourceGroupName: '<resource-group-name>'
    location: '<location>'
    
  • csmFileLink: specificare il collegamento per il modello a fasi. Quando si imposta il valore, usare le variabili restituite dall'attività di copia file. L'esempio seguente si collega a un modello denominato mainTemplate.json. La cartella denominata templates è inclusa perché la posizione in cui l'attività di copia file ha copiato il file. Nella pipeline specificare il percorso del modello e il nome del modello.

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

L'aspetto della pipeline è simile al seguente:

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 si seleziona Salva, la pipeline di compilazione viene eseguita automaticamente. Nel frame Processi selezionare Processo per visualizzare lo stato del processo.

Passaggi successivi