Configurare la distribuzione continua con Chocolatey

Nota

Automazione di Azure State Configuration verrà ritirato il 30 settembre 2027. Passare a Configurazione di Azure Machine entro tale data. Per altre informazioni, vedere l'annuncio del post di blog. Il servizio Configurazione macchina di Azure combina le funzionalità dell'estensione DSC, di State Configuration di Automazione di Azure e le funzionalità più comunemente richieste dai commenti e suggerimenti dei clienti. Configurazione macchina di Azure include anche il supporto del computer ibrido tramite i server abilitati per Arc.

Attenzione

Automazione di Azure DSC per Linux è stato ritirato il 30 settembre 2023. Per altre informazioni, vedere l'annuncio.

In un ambiente DevOps sono disponibili molti strumenti utili in diversi punti della pipeline di integrazione continua. State Configuration per Automazione di Azure è una nuova aggiunta alle opzioni disponibili per i team DevOps.

Automazione di Azure è un servizio gestito di Microsoft Azure che consente di automatizzare diverse attività tramite runbook, nodi e risorse condivise, ad esempio credenziali, pianificazioni e variabili globali. State Configuration per Automazione di Azure estende questa funzionalità di automazione includendo strumenti Desired State Configuration (DSC) di PowerShell. Ecco un'interessante panoramica.

Questo articolo illustra come configurare la distribuzione continua per un computer Windows. È possibile estendere facilmente la tecnica per includere tutti i computer Windows necessari nel ruolo, ad esempio un sito Web e passare da lì a più ruoli.

Distribuzione continua con VM IaaS

A livello generale

Gli aspetti da considerare sono molteplici, ma possono comunque essere suddivisi in due processi principali:

  • Scrittura di codice e relativo test, quindi creazione e pubblicazione dei pacchetti di installazione per le versioni principale e secondaria del sistema.
  • Creazione e gestione delle VM che installeranno ed eseguiranno il codice nei pacchetti.

Dopo l'implementazione di entrambi questi processi di base, si potrà aggiornare automaticamente il pacchetto in qualsiasi VM specifica, man mano che vengono create e distribuite nuove versioni.

Panoramica dei componenti

Gli strumenti di gestione dei pacchetti, ad esempio apt-get, sono ben noti nell'ambiente Linux, ma non lo sono altrettanto nell'ambiente Windows. Chocolatey è una gestione pacchetti per Windows. Il post di blog di Scott Hanselman su Chocolatey è un'ottima introduzione. Chocolatey consente di usare la riga di comando per installare i pacchetti da un repository centrale in un sistema operativo Windows. È possibile creare e gestire un repository personalizzato e Chocolatey può installare pacchetti da tutti i repository designati dall'utente.

PowerShell DSC è uno strumento di PowerShell che consente di dichiarare la configurazione che si vuole applicare a un computer. Se si vuole ad esempio installare Chocolatey, installare IIS, aprire la porta 80 e installare la versione 1.0.0 di un sito Web, Gestione configurazione locale di DSC consente di implementare tale configurazione. Un server di pull DSC mantiene un repository di configurazioni per i computer dell'utente. Gestione configurazione locale in ogni computer controlla periodicamente se la configurazione esistente corrisponde a quella archiviata. Può segnalare lo stato o provare a riallineare il computer con la configurazione archiviata. È possibile modificare la configurazione archiviata nel server di pull per fare in modo che il computer o un set di computer venga allineato con la configurazione modificata.

Una risorsa DSC è un modulo di codice con funzionalità specifiche, ad esempio per la gestione della rete, di Active Directory o SQL Server. La risorsa DSC Chocolatey sa come accedere a un server NuGet, scaricare pacchetti, installare pacchetti ed eseguire altre attività. In PowerShell Gallerysono disponibili numerose altre risorse DSC. Questi moduli vengono installati dall'utente nel server di pull di State Configuration di Automazione di Azure per poter essere usati nelle configurazioni personalizzate.

I modelli di Resource Manager offrono un modo dichiarativo per generare risorse per l'infrastruttura, ad esempio:

  • reti e subnet
  • sicurezza di rete
  • instradamento
  • servizi di bilanciamento del carico,
  • Schede di interfaccia di rete, macchine virtuali e altre

Per un confronto tra il modello di distribuzione resource manager (dichiarativo) e il modello di distribuzione classica di Azure (imperativo), vedere Distribuzione classica di Azure Resource Manager e distribuzione classica. Questo articolo include una discussione sui provider di risorse di base: calcolo, archiviazione e rete.

Una funzionalità chiave di un modello di Resource Manager è la possibilità di installare un'estensione di macchina virtuale durante il provisioning della macchina virtuale. Un'estensione VM include funzionalità specifiche, come l'esecuzione di uno script personalizzato, l'installazione di software antivirus e l'esecuzione di uno script di configurazione DSC. Sono disponibili molti altri tipi di estensioni VM.

Descrizione rapida del diagramma

A partire dall'alto, si scrive il codice, si compila e si eseguono i test e quindi si crea un pacchetto di installazione. Chocolatey può gestire diversi tipi di pacchetti di installazione, ad esempio MSI, MSU, ZIP. Se le funzionalità native di Chocolatey non sono del tutto soddisfacenti, si può sempre ricorrere alle potenzialità complete di PowerShell per eseguire l'installazione effettiva. Inserire il pacchetto in una posizione raggiungibile, come un repository di pacchetti. Questo esempio di utilizzo usa una cartella pubblica in un account di archiviazione BLOB di Azure, ma può trovarsi anche in un'altra posizione. Chocolatey funziona in modalità nativa con i server NuGet e alcuni altri per la gestione dei metadati dei pacchetti. Questo articolo descrive le opzioni. Questo esempio di utilizzo usa NuGet. Nuspec sono i metadati relativi ai pacchetti. Le informazioni NuSpec vengono compilate in un NuPkg e archiviate in un server NuGet. Quando la configurazione richiede un pacchetto in base al nome e fa riferimento a un server NuGet, la risorsa DSC di Chocolatey nella VM estrae il pacchetto e lo installa. È anche possibile richiedere una versione specifica di un pacchetto.

Nella parte in basso dell'immagine è presente un modello di Azure Resource Manager. In questo esempio di utilizzo l'estensione VM registra la macchina virtuale con il server di pull di State Configuration di Automazione di Azure come nodo. La configurazione viene archiviata due volte nel server di pull: una volta come testo normale e una volta compilata come file MOF. Nel portale di Azure il file MOF rappresenta una configurazione di nodi invece di una semplice configurazione.

È relativamente semplice creare Nuspec, compilarlo e archiviarlo in un server NuGet. Il passaggio successivo alla distribuzione continua richiede le attività una tantum seguenti:

  • Configurare il server di pull
  • Registrare i nodi con il server
  • Creare la configurazione iniziale nel server

È necessario aggiornare la configurazione e la configurazione del nodo nel server di pull solo quando si aggiornano e distribuiscono i pacchetti nel repository.

Se non si inizia con un modello di Resource Manager, sono disponibili comandi di PowerShell che consentono di registrare le macchine virtuali con il server di pull. Per altre informazioni, vedere Onboarding di computer per la gestione tramite State Configuration di Automazione di Azure.

Informazioni sull'esempio di utilizzo

L'esempio di utilizzo contenuto in questo articolo inizia con una VM da un'immagine generica di Windows Server 2012 R2 disponibile nella raccolta di Azure. È possibile iniziare da qualsiasi immagine archiviata e usarla come base per modificare la configurazione DSC. La modifica della configurazione basata su un'immagine è tuttavia molto più complessa rispetto all'aggiornamento dinamico della configurazione mediante DSC.

Non è necessario usare un modello di Resource Manager e l'estensione VM per usare questa tecnica con le proprie VM. Inoltre, le VM non devono trovarsi necessariamente in Azure per la gestione della distribuzione continua. È sufficiente installare Chocolatey e configurare Gestione configurazione locale nella macchina virtuale in modo che sappia dove si trova il server di pull.

Quando si aggiorna un pacchetto in una VM in produzione, è necessario escluderla dalla rotazione mentre viene installato l'aggiornamento. La procedura per eseguire questa operazione varia ampiamente. Ad esempio, per una VM con bilanciamento del carico di Azure è possibile aggiungere un probe personalizzato. Durante l'aggiornamento della macchina virtuale, fare in modo che l'endpoint del probe restituisca un valore 400. La modifica necessaria per causare questa modifica può trovarsi all'interno della configurazione, in quanto può modificare per tornare a restituire un 200 al termine dell'aggiornamento.

Il codice sorgente completo per questo esempio di utilizzo si trova in questo progetto di Visual Studio su GitHub.

Passaggio 1: configurare il server di pull e l'account di Automazione

Eseguire i comandi seguenti in una sessione di PowerShell autenticata (Connect-AzAccount):

New-AzResourceGroup -Name MY-AUTOMATION-RG -Location MY-RG-LOCATION-IN-QUOTES
$newAzAutomationAccountSplat = @{
    ResourceGroupName = 'MY-AUTOMATION-RG'
    Location = 'MY-RG-LOCATION-IN-QUOTES'
    Name = 'MY-AUTOMATION-ACCOUNT'
}
New-AzAutomationAccount @newAzAutomationAccountSplat

Questo passaggio richiede alcuni minuti durante la configurazione del server di pull.

È possibile creare l'account di Automazione in una delle aree di Azure seguenti:

  • Stati Uniti orientali 2
  • Stati Uniti centro-meridionali
  • US Gov Virginia
  • Europa occidentale
  • Asia sud-orientale
  • Giappone orientale
  • India centrale
  • Australia sud-orientale
  • Canada centrale
  • Europa settentrionale

Passaggio 2: apportare modifiche all'estensione della macchina virtuale nel modello di Resource Manager

I dettagli per la registrazione della VM, usando l'estensione VM di PowerShell DSC, sono disponibili in questo modello di avvio rapido di Azure. Questo passaggio registra la nuova VM con il server di pull nell'elenco di nodi DSC. Parte di tale registrazione consiste nella specifica della configurazione da applicare ai nodi. Questa configurazione del nodo non deve ancora esistere nel server di pull, ma è necessario scegliere il nome del nodo e il nome della configurazione. Per questo esempio, il nodo è isvbox e il nome della configurazione è ISVBoxConfig. Il nome di configurazione del nodo specificato in DeploymentTemplate.json è ISVBoxConfig.isvbox.

Passaggio 3: aggiungere le risorse DSC necessarie al server di pull

PowerShell Gallery può installare le risorse DSC nell'account Automazione di Azure. Passare alla risorsa desiderata e selezionare Distribuisci in Automazione di Azure.

Esempio di PowerShell Gallery

Un'altra tecnica aggiunta di recente al portale di Azure consente di inserire nuovi moduli o aggiornare quelli esistenti. Selezionare l'icona Sfoglia raccolta per visualizzare l'elenco dei moduli nella raccolta, esaminare i dettagli e importare nell'account di Automazione. È possibile usare questo processo per mantenere aggiornati i moduli. Inoltre, la funzionalità di importazione controlla le dipendenze con altri moduli per assicurarsi che non venga eseguita alcuna sincronizzazione.

È disponibile anche un approccio manuale, usato solo una volta per ogni risorsa, a meno che non si voglia eseguire l'aggiornamento in un secondo momento. Per altre informazioni sulla creazione di moduli di integrazione di PowerShell, vedere Creazione di moduli di integrazione per Automazione di Azure.

Nota

La struttura delle cartelle di un modulo di integrazione di PowerShell per un computer Windows è leggermente diversa da quella prevista da Automazione di Azure.

  1. Installare Windows Management Framework versione 5 (non necessario per Windows 10).

  2. Installare il modulo di integrazione.

    Install-Module -Name MODULE-NAME`    <—grabs the module from the PowerShell Gallery
    
  3. Copiare la cartella del modulo da C:\Program Files\WindowsPowerShell\Modules\MODULE-NAME in una cartella temporanea.

  4. Eliminare esempi e documentazione dalla cartella principale.

  5. Comprimere la cartella principale e denominare il file ZIP come la cartella.

  6. Inserire il file ZIP in una posizione HTTP raggiungibile, ad esempio l'archivio BLOB in un account di archiviazione di Azure.

  7. Esegui il comando seguente:

    $newAzAutomationModuleSplat = @{
        ResourceGroupName = 'MY-AUTOMATION-RG'
        AutomationAccountName = 'MY-AUTOMATION-ACCOUNT'
        Name = 'MODULE-NAME'
        ContentLinkUri = 'https://STORAGE-URI/CONTAINERNAME/MODULE-NAME.zip'
    }
    New-AzAutomationModule @newAzAutomationModuleSplat
    

L'esempio incluso esegue questi passaggi per cChoco e xNetworking.

Passaggio 4: aggiungere la configurazione di nodi al server di pull

Non è necessario eseguire operazioni speciali la prima volta che si importa la configurazione nel server di pull e si procede alla compilazione. Tutte le importazioni o compilazioni successive della stessa configurazione avranno esattamente lo stesso aspetto. Ogni volta che si aggiorna il pacchetto ed è necessario effettuarne il push all'ambiente di produzione, si eseguirà questo passaggio dopo avere verificato che il file di configurazione è corretto, inclusa la nuova versione del pacchetto. Ecco il file ISVBoxConfig.ps1di configurazione :

Configuration ISVBoxConfig
{
    Import-DscResource -ModuleName cChoco
    Import-DscResource -ModuleName xNetworking

    Node 'isvbox' {

        cChocoInstaller installChoco
        {
            InstallDir = 'C:\choco'
        }

        WindowsFeature installIIS
        {
            Ensure = 'Present'
            Name   = 'Web-Server'
        }

        xFirewall WebFirewallRule
        {
            Direction    = 'Inbound'
            Name         = 'Web-Server-TCP-In'
            DisplayName  = 'Web Server (TCP-In)'
            Description  = 'IIS allow incoming web site traffic.'
            Enabled       = 'True'
            Action       = 'Allow'
            Protocol     = 'TCP'
            LocalPort    = '80'
            Ensure       = 'Present'
        }

        cChocoPackageInstaller trivialWeb
        {
            Name      = 'trivialweb'
            Version   = '1.0.0'
            Source    = 'MY-NUGET-V2-SERVER-ADDRESS'
            DependsOn = '[cChocoInstaller]installChoco','[WindowsFeature]installIIS'
        }
    }
}

Lo script seguente New-ConfigurationScript.ps1 è stato modificato per usare il modulo Az PowerShell:

$importAzAutomationDscConfigurationSplat = @{
    ResourceGroupName = 'MY-AUTOMATION-RG'
    AutomationAccountName = 'MY-AUTOMATION-ACCOUNT'
    SourcePath = 'C:\temp\AzureAutomationDsc\ISVBoxConfig.ps1'
    Published = -Published
    Force = -Force
}
Import-AzAutomationDscConfiguration @importAzAutomationDscConfigurationSplat

$startAzAutomationDscCompilationJobSplat = @{
    ResourceGroupName = 'MY-AUTOMATION-RG'
    AutomationAccountName = 'MY-AUTOMATION-ACCOUNT'
    ConfigurationName = 'ISVBoxConfig'
}
$jobData = Start-AzAutomationDscCompilationJob @startAzAutomationDscCompilationJobSplat

$compilationJobId = $jobData.Id

$getAzAutomationDscCompilationJobSplat = @{
    ResourceGroupName = 'MY-AUTOMATION-RG'
    AutomationAccountName = 'MY-AUTOMATION-ACCOUNT'
    Id = $compilationJobId
}
Get-AzAutomationDscCompilationJob @getAzAutomationDscCompilationJobSplat

Passaggio 5: creare e gestire i metadati dei pacchetti

Per ogni pacchetto inserito nel repository di pacchetti è necessario un Nuspec che lo descriva. Deve essere compilato e archiviato nel server NuGet. Per altre informazioni, vedere [Creare un pacchetto NuGet usando l'interfaccia della riga di comando di nuget.exe].

È possibile usare MyGet.org come server NuGet. È possibile acquistare questo servizio, ma è disponibile uno SKU iniziale gratuito. Per istruzioni sull'installazione del proprio server NuGet per i pacchetti privati, vedere la documentazione su Nuget.org.

Passo 6: legare tutto insieme

Ogni volta che una versione passa il controllo di qualità e viene approvata per la distribuzione, viene creato il pacchetto e Nuspec e Nupkg vengono aggiornati e distribuiti nel server NuGet. È necessario aggiornare la configurazione (passaggio 4) con il nuovo numero di versione. Inviarlo quindi al server di pull e compilarlo.

A questo punto, le macchine virtuali che dipendono da tale configurazione devono effettuare l'aggiornamento e installarlo. Questi aggiornamenti sono semplici: solo una o due righe di PowerShell. Per Azure DevOps, alcuni di essi vengono incapsulati nelle attività di compilazione che è possibile concatenare in una compilazione. Per altre informazioni dettagliate, vedere questo articolo. Questo repository GitHub descrive le attività di compilazione disponibili.

Passaggi successivi