Esercizio - Distribuire modelli di Azure Resource Manager come parte delle attività CI/CD con GitHub Actions

Completato

In questa unità si distribuirà un modello di Azure Resource Manager (ARM) da un flusso di lavoro di GitHub Actions.

Importante

Questo esercizio viene eseguito esternamente all'ambiente Microsoft Learn. Per questo esercizio è necessario avere una sottoscrizione di Azure e possono venire addebitati costi. Il motivo è che sarà necessario creare un'entità servizio, che non è supportata nella sottoscrizione dell'ambiente sandbox. Se non hai ancora una sottoscrizione di Azure, crea un account gratuito prima di iniziare.

Creare l'account e il repository GitHub

Prima di tutto, se non si ha un account GitHub, crearne uno subito nella pagina di creazione dell'account GitHub. L'account è gratuito.

Screenshot che mostra la pagina di creazione dell'account GitHub.

Dopo aver creato l'account, accedere e creare un nuovo repository che potrà contenere i modelli come parte dell'approccio di infrastruttura come codice (IaC). Per creare il repository (comunemente noto nel settore come repo), completare questi passaggi:

  1. Nell'angolo in alto a destra di una pagina nel sito GitHub usare il menu a discesa + e scegliere New repository (Nuovo repository). In alternativa, selezionare il pulsante Create repository (Crea repository), se visualizzato.

    Screenshot che mostra le selezioni per creare un repository GitHub.

  2. Digitare un nome breve e facile da ricordare per il repository. Ad esempio, usare Deploy-ARM-Template. È possibile aggiungere una descrizione del repository. Ad esempio, usare Distribuzione del primo modello di Azure Resource Manager con GitHub Actions.

  3. Scegliere un'impostazione relativa alla visibilità del repository. I repository pubblici sono accessibili a tutti in Internet. I repository privati sono accessibili solo all'utente che li crea e a quelli con cui viene condiviso l'accesso in modo esplicito. Per questo esercizio vanno bene entrambe le opzioni.

  4. In Inizializzare questo repository con:, selezionare Aggiungi un file README.

  5. Selezionare Create repository.

    Screenshot che mostra la creazione dei dettagli del nuovo repository.

Il repository è stato creato e quindi inizializzato con un file README. È quindi necessario eseguire il commit di un modello e di un file di parametri del modello nel repository.

Nota

I file README sono ideali per descrivere il progetto in modo più dettagliato o per aggiungere documentazione, ad esempio le istruzioni per l'installazione o l'uso del progetto. Il contenuto del file README viene visualizzato automaticamente nella pagina iniziale del repository.

Eseguire il commit di un file modello di Azure Resource Manager nel repository

  1. In GitHub passare alla pagina principale del repository.

  2. Sopra l'elenco di file selezionare Create new file (Crea nuovo file) nell'elenco a discesa Add file (Aggiungi file).

    Screenshot che mostra le selezioni per aggiungere un modello al repository.

  3. Nel campo relativo al nome del file digitare il nome e l'estensione per il modello. In questo esercizio usare il nome azuredeploy.json. Copiare e incollare il modello seguente nel file GitHub.

    {
        "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "parameters": {
            "VnetName": {
                "type": "string",
                "defaultValue": "VNet-001",
                "metadata": {
                    "description": "Virtual Network Name"
                }
            },
            "CostCenterIO": {
                "type": "string",
                "defaultValue": "12345",
                "metadata": {
                    "description": "Cost Center IO number for cross billing"
                }
            },
            "OwnerName": {
                "type": "string",
                "defaultValue": "John Smith",
                "metadata": {
                    "description": "Name of the stakeholder responsible for this resource"
                }
            }
        },
        "variables": {},
        "resources": [
            {
                "apiVersion": "2018-10-01",
                "type": "Microsoft.Network/virtualNetworks",
                "name": "[parameters('VnetName')]",
                "location": "[resourceGroup().location]",
                "tags": {
                    "CostCenter": "[parameters('CostCenterIO')]",
                    "Owner": "[parameters('OwnerName')]"
                },
                "properties": {
                    "addressSpace": {
                        "addressPrefixes": [
                            "10.0.0.0/16"
                        ]
                    },
                    "enableVmProtection": false,
                    "enableDdosProtection": false,
                    "subnets": [
                        {
                            "name": "subnet001",
                            "properties": {
                                "addressPrefix": "10.0.0.0/24"
                            }
                        },
                        {
                            "name": "subnet002",
                            "properties": {
                                "addressPrefix": "10.0.1.0/24"
                            }
                        }
                    ]
                }
            }
        ]
    }
    
  4. Aggiungere una descrizione nella sezione Commit new file (Esegui il commit del nuovo file) e selezionare Commit new file (Esegui il commit del nuovo file) per salvare il file nel repository.

    Screenshot che mostra il salvataggio di un nuovo modello nel repository.

Configurare l'autenticazione tra GitHub Actions e la sottoscrizione di Azure

Per distribuire qualsiasi risorsa in Azure usando GitHub Actions, è necessario creare un'entità servizio di Azure e concedere le autorizzazioni per creare le risorse definite nei modelli. Questo passaggio verrà eseguito nella sezione Azure Cloud Shell del portale di Azure dopo aver effettuato l'accesso alla sottoscrizione.

Creare l'entità servizio

Per l'entità servizio di un flusso di lavoro di GitHub Actions per la distribuzione di risorse di Azure, sono necessari i diritti di collaboratore predefiniti corretti.

Lo script dell'interfaccia della riga di comando di Azure seguente mostra come generare un'entità servizio di Azure con autorizzazioni di collaboratore in un gruppo di risorse di Azure. Questo è il gruppo di risorse in cui il flusso di lavoro distribuirà le risorse definite nel modello ARM.

projectName="GitHubActionExercise"
location="eastus"
resourceGroupName="${projectName}-rg"
appName="http://${projectName}"

# Create the resource group
az group create --name $resourceGroupName --location $location

# Store the resource group ID in a variable
scope=$(az group list --query "[?contains(name, '$resourceGroupName')].id" -o tsv)

# Create the service principal with contributor rights to the resource group we just created
az ad sp create-for-rbac --name $appName --role Contributor --scopes $scope --sdk-auth

Nel portale, dopo avere effettuato l'accesso alla sottoscrizione, selezionare l'icona Cloud Shell per aprire la shell nella parte inferiore della pagina.

Animazione che mostra l'apertura di Cloud Shell.

Nella shell usare il codice precedente per creare l'entità servizio. Si otterranno i risultati seguenti. Copiare la parte JSON dei risultati (il contenuto nella casella rossa nello screenshot seguente), perché sarà necessaria per la configurazione del segreto in GitHub.

Screenshot che mostra i risultati per la creazione di un'entità servizio in Azure.

Copiare l'output JSON e archiviarlo come segreto GitHub all'interno del repository GitHub seguendo questa procedura in GitHub: Nel repository GitHub selezionare la scheda Impostazioni. Nel menu a sinistra selezionare l'elenco a discesa Segreti, quindi selezionare Codespaces.

Immettere i valori seguenti e quindi selezionare Add secret (Aggiungi secreto):

  • Nome: immettere AZURE_CREDENTIALS.
  • Segreto: incollare l'output JSON copiato prima.

Screenshot che mostra l'aggiunta di informazioni del segreto dell'entità servizio a un segreto GitHub.

Queste informazioni sono necessarie per specificare l'autenticazione nel flusso di lavoro.

Creazione di un flusso di lavoro

Il file del flusso di lavoro deve essere archiviato nella cartella .github/workflows alla radice del repository. Il file del flusso di lavoro può avere estensione .yml o .yaml.

È possibile creare un file del flusso di lavoro e quindi eseguire il push/caricamento del file nel repository. In alternativa, è possibile usare la procedura seguente per crearlo nell'interfaccia di GitHub:

  1. Dal repository GitHub scegliere Actions (Azioni) dal menu in alto e selezionare Set up a workflow yourself (Configura un flusso di lavoro manualmente).

    Screenshot che mostra le selezioni per configurare un flusso di lavoro.

  2. Rinominare il file del flusso di lavoro se si preferisce un nome diverso da main.yml. Ad esempio, usare deployARMTemplate.yml.

  3. Sostituire il contenuto del file YML con il codice seguente.

    Nota

    In GitHub Marketplace sono incluse alcune azioni personalizzate che è possibile usare per distribuire modelli di Azure Resource Manager. Questo modulo usa il provider del marketplace chiamato Deploy Azure Resource Manager (ARM) Template.

    name: Deploy ARM Template
    
    on:
      push:
        branches:
          - main
    env:
      AZURE_SUBSCRIPTION_ID: << Subscription Id >>   # set this to your Azure Subscription Id
      AZURE_RESOURCE_GROUP: GitHubActionExercise-rg   # set this to your target resource group
    
    jobs:
      deploy-virtual-network-template:
        runs-on: ubuntu-latest
        steps:
          - name: Checkout source code
            uses: actions/checkout@main
    
          - name: Login to Azure
            uses: azure/login@v1
            with:
              creds: ${{ secrets.AZURE_CREDENTIALS }}
    
          - name: Deploy ARM Template
            uses: azure/arm-deploy@v1
            with:
              scope: resourcegroup
              subscriptionId: ${{ env.AZURE_SUBSCRIPTION_ID }}
              resourceGroupName: ${{ env.AZURE_RESOURCE_GROUP }}
              template: ./azuredeploy.json
    

    Il file del flusso di lavoro include tre sezioni.

    • name: Il nome del flusso di lavoro.

    • on: Il nome dell'evento GitHub che attiva il flusso di lavoro. Il flusso di lavoro viene attivato quando si verifica un evento push nel ramo principale che modifica almeno un file nel ramo principale.

    • jobs: l'esecuzione di un flusso di lavoro è costituita da uno o più processi. Solo un processo è denominato deploy-virtual-network-template. Questo processo prevede tre passaggi.

      1. Estrarre il codice sorgente.
      2. Accedere ad Azure.
      3. Distribuire il modello di Azure Resource Manager.

    Importante

    Verificare che il nome del segreto nell'espressione creds: ${{ secrets.AZURE_CREDENTIALS }} corrisponda al nome del segreto salvato nelle impostazioni del repository. Verificare anche che il nome del modello di Azure Resource Manager nel passaggio Deploy ARM Template template: $GITHUB_WORKSPACE/azuredeploy.json corrisponda a quello salvato prima nel repository.

    Nota

    Il nome del gruppo di risorse sarà GitHubActionExercise-rg se è stato usato il codice dell'interfaccia della riga di comando di Azure precedente durante la configurazione delle credenziali di distribuzione. Il nome del gruppo di risorse generato è il nome del progetto, cui viene aggiunto rg.

  4. Selezionare Start commit (Avvia commit). Aggiungere un commento e una descrizione, se necessario.

  5. Verificare che sia selezionata l'opzione Commit directly to the master branch (Esegui il commit direttamente nel ramo principale) e quindi selezionare Commit new file (Esegui il commit del nuovo file) o Commit changes (Esegui il commit delle modifiche).

    Screenshot che mostra il commit di un flusso di lavoro a un ramo principale.

    Dopo aver creato il file del flusso di lavoro e averne eseguito il commit nel ramo principale del repository, il flusso di lavoro viene avviato automaticamente perché il trigger nel flusso di lavoro è un commit/push nel ramo principale.

    on:
      push:
        branches:
          - main
    
  6. Passare al repository e controllare lo stato del flusso di lavoro.

    Screenshot che mostra lo stato del flusso di lavoro.

Controllare la distribuzione

Quando il flusso di lavoro viene completato, passare al portale di Azure per controllare lo stato di distribuzione.

Nel riquadro a sinistra selezionare Gruppi di risorse>GitHubActionExercise-rg. Nel riquadro Distribuzioni verificare che la distribuzione sia riuscita.

Screenshot che mostra lo stato di distribuzione.