Dela via


Konfigurera kontinuerlig distribution med Chocolatey

Kommentar

Azure Automation State Configuration tas ur bruk den 30 september 2027. Övergå till Azure Machine Configuration senast det datumet. Mer information finns i blogginlägget. Azure Machine Configuration-tjänsten kombinerar funktioner i DSC-tillägget, Azure Automation State Configuration och de vanligaste funktionerna från kundfeedback. Azure Machine Configuration innehåller även stöd för hybriddatorer via Arc-aktiverade servrar.

Varning

Azure Automation DSC för Linux har dragits tillbaka den 30 september 2023. Mer information finns i meddelandet.

I en DevOps-värld finns det många verktyg för att hjälpa till med olika punkter i pipelinen för kontinuerlig integrering. Azure Automation State Configuration är ett välkommet nytt tillägg till de alternativ som DevOps-team kan använda.

Azure Automation är en hanterad tjänst i Microsoft Azure som gör att du kan automatisera olika uppgifter med hjälp av runbooks, noder och delade resurser, till exempel autentiseringsuppgifter, scheman och globala variabler. Azure Automation State Configuration utökar den här automatiseringsfunktionen till att omfatta DSC-verktyg (PowerShell Desired State Configuration). Här är en bra översikt.

Den här artikeln visar hur du konfigurerar kontinuerlig distribution (CD) för en Windows-dator. Du kan enkelt utöka tekniken till att inkludera så många Windows-datorer som behövs i rollen, till exempel en webbplats, och gå därifrån till fler roller.

Kontinuerlig distribution för virtuella IaaS-datorer

På hög nivå

Det är ganska mycket som händer här, men lyckligtvis kan det delas upp i två huvudprocesser:

  • Skriva kod och testa den och sedan skapa och publicera installationspaket för större och mindre versioner av systemet.
  • Skapa och hantera virtuella datorer som installerar och kör koden i paketen.

När båda dessa kärnprocesser är på plats är det enkelt att automatiskt uppdatera paketet på dina virtuella datorer när nya versioner skapas och distribueras.

Komponentöversikt

Pakethanterare som apt-get är välkända i Linux-världen, men inte så mycket i Windows-världen. Chocolatey är en pakethanterare för Windows. Scott Hanselmans blogginlägg om Chocolatey är en bra introduktion. Med Chocolatey kan du använda kommandoraden för att installera paket från en central lagringsplats till ett Windows-operativsystem. Du kan skapa och hantera din egen lagringsplats, och Chocolatey kan installera paket från valfritt antal lagringsplatser som du anger.

PowerShell DSC är ett PowerShell-verktyg som gör att du kan deklarera den konfiguration som du vill använda för en dator. Om du till exempel vill ha Chocolatey installerat, IIS installerat, port 80 öppnat och version 1.0.0 av webbplatsen installerad, implementerar DSC Local Configuration Manager (LCM) den konfigurationen. En DSC-pull-server innehåller en lagringsplats med konfigurationer för dina datorer. LCM på varje dator checkar in regelbundet för att se om dess konfiguration matchar den lagrade konfigurationen. Den kan antingen rapportera status eller försöka anpassa datorn till den lagrade konfigurationen igen. Du kan redigera den lagrade konfigurationen på hämtningsservern så att en dator eller uppsättning datorer hamnar i linje med den ändrade konfigurationen.

En DSC-resurs är en kodmodul som har specifika funktioner, till exempel hantering av nätverk, Active Directory eller SQL Server. Chocolatey DSC-resursen vet hur du kommer åt en NuGet Server, laddar ned paket, installerar paket och utför andra uppgifter. Det finns många andra DSC-resurser i PowerShell-galleriet. Du installerar dessa moduler på din Azure Automation State Configuration-pull-server för användning av dina konfigurationer.

Resource Manager-mallar är ett deklarativt sätt att generera resurser för infrastrukturen, till exempel:

  • nätverk och undernät
  • nätverkssäkerhet
  • Routning
  • lastbalanserare,
  • Nätverkskort, virtuella datorer och andra

En jämförelse av Resource Manager-distributionsmodellen (deklarativ) med den klassiska Azure-distributionsmodellen (imperativ) finns i Azure Resource Manager jämfört med klassisk distribution. Den här artikeln innehåller en diskussion om kärnresursprovidrar: beräkning, lagring och nätverk.

En viktig funktion i en Resource Manager-mall är möjligheten att installera ett VM-tillägg under etableringen av den virtuella datorn. Ett VM-tillägg har specifika funktioner, till exempel att köra ett anpassat skript, installera antivirusprogram och köra ett DSC-konfigurationsskript. Det finns många andra typer av VM-tillägg.

Snabb resa runt diagrammet

Från början skriver du koden, skapar den, testar den och skapar sedan ett installationspaket. Chocolatey kan hantera olika typer av installationspaket, till exempel MSI, MSU, ZIP. Och du har den fulla kraften i PowerShell för att göra den faktiska installationen om Chocolateys interna funktioner inte klarar det. Placera paketet på någon plats som kan nås – en paketlagringsplats. I det här användningsexemplet används en gemensam mapp i ett Azure Blob Storage-konto, men det kan finnas var som helst. Chocolatey fungerar internt med NuGet-servrar och några andra för hantering av paketmetadata. I den här artikeln beskrivs alternativen. Användningsexemplet använder NuGet. En Nuspec är metadata om dina paket. Nuspec-informationen kompileras till en NuPkg och lagras på en NuGet-server. När konfigurationen begär ett paket med namn och refererar till en NuGet-server hämtar Chocolatey DSC-resursen på den virtuella datorn paketet och installerar det. Du kan också begära en specifik version av ett paket.

Längst ned till vänster i bilden finns en Azure Resource Manager-mall. I det här användningsexemplet registrerar VM-tillägget den virtuella datorn med Azure Automation State Configuration-hämtningsservern som en nod. Konfigurationen lagras på pull-servern två gånger: en gång som oformaterad text och en gång kompilerad som en MOF-fil. I Azure Portal representerar MOF en nodkonfiguration i stället för en enkel konfiguration.

Det är relativt enkelt att skapa Nuspec, kompilera den och lagra den på en NuGet-server. Nästa steg för kontinuerlig distribution kräver följande engångsuppgifter:

  • Konfigurera hämtningsservern
  • Registrera noderna med servern
  • Skapa den inledande konfigurationen på servern

Du behöver bara uppdatera konfigurationen och nodkonfigurationen på pull-servern när du uppgraderar och distribuerar paket till lagringsplatsen.

Om du inte börjar med en Resource Manager-mall finns det PowerShell-kommandon som hjälper dig att registrera dina virtuella datorer med pull-servern. Mer information finns i Registrera datorer för hantering av Azure Automation State Configuration.

Om användningsexemplet

Användningsexemplet i den här artikeln börjar med en virtuell dator från en allmän Windows Server 2012 R2-avbildning från Azure-galleriet. Du kan börja från valfri lagrad avbildning och sedan justera därifrån med DSC-konfigurationen. Det är dock mycket svårare att ändra konfigurationen som bakas till en avbildning än att dynamiskt uppdatera konfigurationen med hjälp av DSC.

Du behöver inte använda en Resource Manager-mall och VM-tillägget för att använda den här tekniken med dina virtuella datorer. Och dina virtuella datorer behöver inte vara på Azure för att vara under CD-hantering. Installera Bara Chocolatey och konfigurera LCM på den virtuella datorn så att den vet var hämtningsservern finns.

När du uppdaterar ett paket på en virtuell dator som är i produktion måste du ta den virtuella datorn ur rotation medan uppdateringen är installerad. Hur du gör detta varierar kraftigt. Med en virtuell dator bakom en Azure Load Balancer kan du till exempel lägga till en anpassad avsökning. När du uppdaterar den virtuella datorn måste avsökningens slutpunkt returnera 400. Den justering som krävs för att orsaka den här ändringen kan finnas i konfigurationen, liksom justeringen för att växla tillbaka den till att returnera en 200 när uppdateringen är klar.

Fullständig källa för det här användningsexemplet finns i det här Visual Studio-projektet på GitHub.

Steg 1: Konfigurera pull-servern och Automation-kontot

Kör följande kommandon i en autentiserad (Connect-AzAccount) PowerShell-session:

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

Det här steget tar några minuter medan pull-servern har konfigurerats.

Du kan skapa ditt Automation-konto i någon av följande Azure-regioner:

  • USA, östra 2
  • USA, södra centrala
  • US Gov, Virginia
  • Europa, västra
  • Sydostasien
  • Japan, östra
  • Indien, centrala
  • Sydöstra Australien
  • Kanada, centrala
  • Europa, norra

Steg 2: Gör vm-tilläggsjusteringar till Resource Manager-mallen

Information om registrering av virtuella datorer (med hjälp av PowerShell DSC VM-tillägget) finns i den här Azure-snabbstartsmallen. Det här steget registrerar den nya virtuella datorn med pull-servern i listan över tillståndskonfigurationsnoder. En del av den här registreringen är att ange den nodkonfiguration som ska tillämpas på noden. Den här nodkonfigurationen behöver inte finnas ännu på pull-servern, men du måste välja namnet på noden och namnet på konfigurationen. I det här exemplet är isvbox noden och konfigurationsnamnet är ISVBoxConfig. Det nodkonfigurationsnamn som du anger i DeploymentTemplate.json är ISVBoxConfig.isvbox.

Steg 3: Lägg till nödvändiga DSC-resurser till pull-servern

PowerShell-galleriet kan installera DSC-resurser i ditt Azure Automation-konto. Gå till den resurs du vill använda och välj Distribuera till Azure Automation.

PowerShell-galleriet exempel

En annan teknik som nyligen lagts till i Azure Portal gör att du kan hämta nya moduler eller uppdatera befintliga moduler. Välj ikonen Bläddra i galleriet för att se listan över moduler i galleriet, öka detaljnivån och importera till ditt Automation-konto. Du kan använda den här processen för att hålla dina moduler uppdaterade. Dessutom kontrollerar importfunktionen beroenden med andra moduler för att säkerställa att inget blir osynkroniserat.

Det finns också en manuell metod som endast används en gång per resurs, såvida du inte vill uppgradera den senare. Mer information om hur du redigerar PowerShell-integreringsmoduler finns i Redigera integreringsmoduler för Azure Automation.

Kommentar

Mappstrukturen för en PowerShell-integreringsmodul för en Windows-dator skiljer sig lite från den mappstruktur som förväntas av Azure Automation.

  1. Installera Windows Management Framework v5 (behövs inte för Windows 10).

  2. Installera integreringsmodulen.

    Install-Module -Name MODULE-NAME`    <—grabs the module from the PowerShell Gallery
    
  3. Kopiera modulmappen från C:\Program Files\WindowsPowerShell\Modules\MODULE-NAME till en tillfällig mapp.

  4. Ta bort exempel och dokumentation från huvudmappen.

  5. Zippa huvudmappen och namnge ZIP-filen med namnet på mappen.

  6. Placera ZIP-filen på en nåbar HTTP-plats, till exempel bloblagring i ett Azure Storage-konto.

  7. Kör följande kommando.

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

Det inkluderade exemplet implementerar de här stegen för cChoco och xNetworking.

Steg 4: Lägg till nodkonfigurationen på pull-servern

Det är inget speciellt med första gången du importerar konfigurationen till hämtningsservern och kompilerar. Alla senare importer eller kompileringar av samma konfiguration ser exakt likadana ut. Varje gång du uppdaterar paketet och behöver skicka ut det till produktion gör du det här steget när du har kontrollerat att konfigurationsfilen är korrekt – inklusive den nya versionen av paketet. Här är konfigurationsfilen ISVBoxConfig.ps1:

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'
        }
    }
}

Följande New-ConfigurationScript.ps1 skript ändrades för att använda Az PowerShell-modulen:

$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

Steg 5: Skapa och underhålla paketmetadata

För varje paket som du lägger till i paketlagringsplatsen behöver du en Nuspec som beskriver det. Den måste kompileras och lagras på NuGet-servern. Mer information finns i [Skapa ett NuGet-paket med nuget.exe CLI].

Du kan använda MyGet.org som NuGet-server. Du kan köpa den här tjänsten, men du är en kostnadsfri start-SKU. Anvisningar om hur du installerar din egen NuGet-server för dina privata paket finns i dokumentationen om Nuget.org.

Steg 6: Knyta ihop allt

Varje gång en version passerar QA och godkänns för distribution skapas paketet och nuspec och nupkg uppdateras och distribueras till NuGet-servern. Du måste uppdatera konfigurationen (steg 4) med det nya versionsnumret. Skicka den sedan till pull-servern och kompilera den.

Från och med då är det upp till de virtuella datorer som är beroende av den konfigurationen för att hämta uppdateringen och installera den. Var och en av dessa uppdateringar är enkel – bara en rad eller två av PowerShell. För Azure DevOps är vissa av dem inkapslade i bygguppgifter som du kan länka ihop i en version. Den här artikeln innehåller mer information. Den här GitHub-lagringsplatsen beskriver de tillgängliga bygguppgifterna.

Nästa steg