Delen via


Wijzigingen in gedrag in PowerShell Desired State Configuration voor machineconfiguratie

Voordat u begint, is het een goed idee om het overzicht van de computerconfiguratie te lezen.

Er is een video-overzicht van dit document beschikbaar.

Machineconfiguratie maakt gebruik van PowerShell Desired State Configuration (PSDSC) versie 2 om machines te controleren en te configureren. De DSC-configuratie definieert de status waarin de machine zich moet bevinden. Er zijn veel belangrijke verschillen in hoe DSC wordt geïmplementeerd in de machineconfiguratie.

Machineconfiguratie maakt gebruik van PowerShell 7 platformoverschrijdend

Machineconfiguratie is zo ontworpen dat het beheer van Windows en Linux consistent kan zijn. In beide besturingssysteemomgevingen kan iemand met PowerShell DSC-kennis configuraties maken en publiceren met behulp van scriptvaardigheden.

Machineconfiguratie maakt alleen gebruik van PowerShell DSC versie 3 en is niet afhankelijk van de vorige implementatie van DSC voor Linux of de nx* providers die zijn opgenomen in die opslagplaats.

Vanaf versie 1.26.33 werkt de computerconfiguratie in PowerShell 7.1.2 voor Windows en PowerShell 7.2 preview 6 voor Linux. Vanaf versie 7.2 is de PSDesiredStateConfiguration-module verplaatst van onderdeel van de PowerShell-installatie en wordt in plaats daarvan geïnstalleerd als een module uit de PowerShell Gallery.

Meerdere configuraties

Machineconfiguratie ondersteunt het toewijzen van meerdere configuraties aan dezelfde computer. Er zijn geen speciale stappen vereist in het besturingssysteem van de computerconfiguratie-extensie. U hoeft geen gedeeltelijke configuraties te configureren.

Afhankelijkheden worden beheerd per configuratie

Wanneer een configuratie wordt verpakt met behulp van de beschikbare hulpprogramma's, worden de vereiste afhankelijkheden voor de configuratie opgenomen in een .zip bestand. Machines halen de inhoud uit in een unieke map voor elke configuratie. De agent die wordt geleverd door de machineconfiguratie-extensie maakt een toegewezen PowerShell-sessie voor elke configuratie. Hierbij wordt het $Env:PSModulePath automatisch laden van modules beperkt tot alleen het pad waar het pakket is geëxtraheerd.

Deze wijziging heeft meerdere voordelen:

  • Het is mogelijk om verschillende moduleversies te gebruiken voor elke configuratie, op dezelfde computer.
  • Wanneer een configuratie niet meer nodig is op een computer, verwijdert de agent veilig de hele map waarin de configuratie is uitgepakt. U hoeft geen gedeelde afhankelijkheden tussen configuraties te beheren.
  • Het is niet vereist om meerdere versies van een module in een centrale service te beheren.

Artefacten worden beheerd als pakketten

De functie Azure Automation State Configuration bevat artefactbeheer voor modules en configuratiescripts. Zodra beide naar de service zijn gepubliceerd, kan het script worden gecompileerd naar de MOF-indeling. Op dezelfde manier vereist de Windows Pull Server ook het beheren van configuraties en modules op het webservice-exemplaar. De DSC-extensie heeft daarentegen een vereenvoudigd model waarin alle artefacten samen worden verpakt en opgeslagen op een locatie die toegankelijk is vanaf de doelcomputer met behulp van een HTTPS-aanvraag. Azure Blob Storage is de populaire optie voor het hosten van de artefacten.

Machineconfiguratie maakt alleen gebruik van het vereenvoudigde model waarbij alle artefacten samen worden verpakt en toegankelijk zijn vanaf de doelcomputer via HTTPS. U hoeft modules, scripts of compileer niet te publiceren in de service. Een wijziging is dat het pakket altijd een gecompileerde MOF moet bevatten. Het is niet mogelijk om een scriptbestand op te nemen in het pakket en te compileren op de doelcomputer.

Maximale grootte van aangepast configuratiepakket

In Azure Automation State Configuration zijn DSC-configuraties beperkt in grootte. Machineconfiguratie ondersteunt een totale pakketgrootte van 100 MB vóór compressie. Er is geen specifieke limiet voor de grootte van het MOF-bestand in het pakket.

De configuratiemodus wordt ingesteld in het pakketartefact

Wanneer u het configuratiepakket maakt, wordt de modus ingesteld met behulp van de volgende opties:

  • Audit - Controleert de naleving van een machine. Er worden geen wijzigingen aangebracht.
  • AuditandSet - Controleert en herstelt de nalevingsstatus van de computer. Wijzigingen worden aangebracht als de machine niet compatibel is.

De modus wordt ingesteld in het pakket in plaats van in de Local Configuration Manager-service , omdat elke configuratie kan worden toegepast met een andere modus.

Parameterondersteuning via Azure Resource Manager

Parameters die zijn ingesteld door de eigenschapmatrix configurationParameter in machineconfiguratietoewijzingen overschrijven de statische tekst in een MOF-configuratiebestand wanneer het bestand wordt opgeslagen op een computer. Met parameters kunnen aanpassingen en een operator wijzigingen beheren vanuit de service-API zonder dat u opdrachten op de computer hoeft uit te voeren.

Parameters in Azure Policy die waarden doorgeven aan machineconfiguratietoewijzingen, moeten tekenreekstype zijn. Het is niet mogelijk om matrices door te geven via parameters, zelfs als de DSC-resource matrices ondersteunt.

Triggerset van buiten de computer

Een uitdaging in eerdere versies van DSC is het corrigeren van drift op schaal zonder veel aangepaste code en afhankelijkheid van externe WinRM-verbindingen. Met de gastconfiguratie wordt dit probleem opgelost. Gebruikers van de machineconfiguratie hebben controle over driftcorrectie via Herstel op aanvraag.

Reeks bevat get-methode

Wanneer de machineconfiguratie een computer controleert of configureert, wordt dezelfde reeks gebeurtenissen gebruikt voor Zowel Windows als Linux. De opmerkelijke wijziging in gedrag is dat de Get methode wordt aangeroepen door de service om details over de status van de machine te retourneren.

  1. De agent wordt eerst uitgevoerd Test om te bepalen of de configuratie de juiste status heeft.
  2. Als het pakket is ingesteld op Audit, bepaalt de Booleaanse waarde die door de functie wordt geretourneerd of de Status van Azure Resource Manager voor de gasttoewijzing moet zijn Compliant of NonCompliant.
  3. Als het pakket is ingesteld op AuditandSet, bepaalt de Booleaanse waarde of de machine moet worden hersteld door de configuratie toe te passen met behulp van de Set methode. Als de Test methode wordt geretourneerd $false, Set wordt uitgevoerd. Als Test het resultaat wordt $truegeretourneerd, wordt deze Set niet uitgevoerd.
  4. Ten slotte wordt de provider uitgevoerd Get om de huidige status van elke instelling te retourneren, zodat er details beschikbaar zijn over waarom een machine niet compatibel is en om te bevestigen dat de huidige status compatibel is.

Speciale vereisten voor Get

De DSC-methode Get heeft speciale vereisten voor machineconfiguratie die niet nodig zijn voor DSC.

  • De hashtabel die wordt geretourneerd, moet een eigenschap met de naam Redenen bevatten.
  • De eigenschap Redenen moet een matrix zijn.
  • Elk item in de matrix moet een hash-tabel zijn met sleutels met de naam Code en Phrase.
  • Er moeten geen andere waarden dan de hashtabel worden geretourneerd.

De eigenschap Redenen wordt door de service gebruikt om te standaardiseren hoe nalevingsinformatie wordt gepresenteerd. U kunt elk item in Redenen beschouwen als een bericht over hoe de resource is of niet compatibel is. De eigenschap is een matrix omdat een resource om meer dan één reden niet meer aan de naleving voldoet.

De eigenschappen Code en Phrase worden verwacht door de service. Bij het ontwerpen van een aangepaste resource stelt u de tekst in die u wilt weergeven als de reden waarom de resource niet compatibel is als de waarde voor Phrase. Code heeft specifieke opmaakvereisten, zodat rapportage duidelijk informatie kan weergeven over de resource die wordt gebruikt om de controle uit te voeren. Deze oplossing maakt gastconfiguratie uitbreidbaar. Elke opdracht kan worden uitgevoerd zolang de uitvoer kan worden geretourneerd als een tekenreekswaarde voor de eigenschap Phrase .

  • Code (tekenreeks): de naam van de resource, herhaald en vervolgens een korte naam zonder spaties als id om de reden. Deze drie waarden moeten worden gescheiden door dubbele punten zonder spaties.
    • Een voorbeeld hiervan is registry:registry:keynotpresent
  • Woordgroep (tekenreeks): leesbare tekst om uit te leggen waarom de instelling niet compatibel is.
    • Een voorbeeld hiervan is The registry key $key isn't present on the machine.
$reasons = @()
$reasons += @{
  Code   = 'Name:Name:ReasonIdentifier'
  Phrase = 'Explain why the setting is not compliant'
}
return @{
    reasons = $reasons
}

Wanneer u opdrachtregelprogramma's gebruikt om informatie op te halen die wordt geretourneerd Get, vindt u mogelijk dat het hulpprogramma uitvoer retourneert die u niet had verwacht. Hoewel u de uitvoer in PowerShell vastlegt, is de uitvoer mogelijk ook naar de standaardfout geschreven. U kunt dit probleem voorkomen door uitvoer om te leiden naar null.

De ingesloten klasse Van de eigenschap Reasons

In op scripts gebaseerde resources (alleen Windows) wordt de klasse Redenen als volgt opgenomen in het MOF-schemabestand.

[ClassVersion("1.0.0.0")]
class Reason
{
  [Read] String Phrase;
  [Read] String Code;
};

[ClassVersion("1.0.0.0"), FriendlyName("ResourceName")]
class ResourceName : OMI_BaseResource
{
  [Key, Description("Example description")] String Example;
  [Read, EmbeddedInstance("Reason")] String Reasons[];
};

In op klassen gebaseerde resources (Windows en Linux) wordt de klasse Reason als volgt opgenomen in de PowerShell-module. Linux is hoofdlettergevoelig, dus de C in Code - en P in Phrase moeten worden gekapitaliseerd.

enum ensure {
  Absent
  Present
}

class Reason {
  [DscProperty()]
  [string] $Code

  [DscProperty()]
  [string] $Phrase
}

[DscResource()]
class Example {

  [DscProperty(Key)]
  [ensure] $ensure

  [DscProperty()]
  [Reason[]] $Reasons

  [Example] Get() {
    # return current current state
  }

  [void] Set() {
    # set the state
  }

  [bool] Test() {
    # check whether state is correct
  }
}

Als de resource vereiste eigenschappen heeft, moeten deze eigenschappen ook parallel worden geretourneerd Get met de klasse Reason . Als De reden niet is opgenomen, bevat de service een 'catch-all'-gedrag waarmee de waarden worden Get vergeleken met en de waarden die worden geretourneerd door Get, en een gedetailleerde vergelijking als reden.

Configuratienamen

De naam van de aangepaste configuratie moet overal consistent zijn. Deze items moeten dezelfde naam hebben:

  • Het .zip bestand voor het inhoudspakket
  • De configuratienaam in het MOF-bestand
  • De naam van de machineconfiguratietoewijzing in de Azure Resource Manager-sjabloon

Opdrachten uitvoeren in Windows PowerShell

Het uitvoeren van Windows-modules in PowerShell kan worden bereikt met behulp van het onderstaande patroon in uw DSC-resources. Met het onderstaande patroon wordt het PSModulePath uitvoeren van Windows PowerShell tijdelijk ingesteld in plaats van PowerShell om de vereiste modules te detecteren die beschikbaar zijn in Windows PowerShell. Dit voorbeeld is een fragment dat is aangepast aan de DSC-resource die wordt gebruikt in de ingebouwde DSC-resource van Secure Web Server .

Met dit patroon wordt tijdelijk het PowerShell-uitvoeringspad ingesteld dat moet worden uitgevoerd vanuit Windows PowerShell en wordt de vereiste cmdlet gedetecteerd. Dit is Get-WindowsFeaturein dit geval. De uitvoer van de opdracht wordt geretourneerd en vervolgens gestandaardiseerd voor compatibiliteitsvereisten. Zodra de cmdlet is uitgevoerd, $env:PSModulePath wordt deze teruggezet op het oorspronkelijke pad.

# The Get-WindowsFeature cmdlet needs to be run through Windows PowerShell
# rather than through PowerShell, which is what the Policy engine runs.
$null = Invoke-Command -ScriptBlock {
    param ([string]$FileName)

    $InitialPSModulePath   = $env:PSModulePath
    $WindowsPSFolder       = "$env:SystemRoot\System32\WindowsPowershell\v1.0"
    $WindowsPSExe          = "$WindowsPSFolder\powershell.exe"
    $WindowsPSModuleFolder = "$WindowsPSFolder\Modules"
    $GetFeatureScriptBlock = {
        param([string]$FileName)

        if (Get-Command -Name Get-WindowsFeature -ErrorAction SilentlyContinue) {
            Get-WindowsFeature -Name Web-Server |
                ConvertTo-Json |
                Out-File $FileName
        } else {
            Add-Content -Path $FileName -Value 'NotServer'
        }
    }

    try {
        # Set env variable to include Windows Powershell modules so we can find
        # the Get-WindowsFeature cmdlet.
        $env:PSModulePath = $WindowsPSModuleFolder
        # Call Windows PowerShell to get the info about the Web-Server feature
        & $WindowsPSExe -command $WindowsFeatureScriptBlock -args $FileName
    } finally {
        # Reset the env variable even if there's an error.
        $env:PSModulePath = $InitialPSModulePath
    }
}

Algemene DSC-functies zijn niet beschikbaar tijdens openbare preview van de machineconfiguratie

Tijdens de openbare preview biedt de machineconfiguratie geen ondersteuning voor het opgeven van afhankelijkheden tussen machines met behulp van WaitFor* resources. Het is niet mogelijk dat de ene machine de status van een andere machine kan bekijken en wachten voordat de voortgang wordt uitgevoerd.

De verwerking van opnieuw opstarten is niet beschikbaar in de openbare preview-versie van de machineconfiguratie, inclusief de $global:DSCMachineStatus niet beschikbaar. Configuraties kunnen een knooppunt niet opnieuw opstarten tijdens of aan het einde van een configuratie.

Bekende compatibiliteitsproblemen met ondersteunde modules

De PsDscResources-module in de PowerShell Gallery en de PSDesiredStateConfiguration-module die wordt geleverd met Windows, worden ondersteund door Microsoft en zijn een veelgebruikte set resources voor DSC. Totdat de PSDscResources-module is bijgewerkt voor DSCv3, moet u rekening houden met de volgende bekende compatibiliteitsproblemen.

  • Gebruik geen resources uit de PSDesiredStateConfiguration-module die wordt geleverd met Windows. Schakel in plaats daarvan over naar PSDscResources.
  • Gebruik de WindowsFeatureresources en WindowsFeatureSetWindowsOptionalFeatureSetWindowsOptionalFeatureresources niet in PsDscResources. Er is een bekend probleem opgetreden bij het laden van de DISM-module in PowerShell 7.1.3 op Windows Server waarvoor een update is vereist.

De nx* resources voor Linux die zijn opgenomen in de DSC voor Linux-opslagplaats , zijn geschreven in een combinatie van de talen C en Python. Omdat het pad voorwaarts voor DSC in Linux powerShell is, zijn de bestaande nx* resources niet compatibel met DSCv3. Totdat een nieuwe module met ondersteunde resources voor Linux beschikbaar is, is het vereist om aangepaste resources te maken.

Co-existentie met DSC-versie 3 en eerdere versies

DSC-versie 3 in computerconfiguratie kan naast oudere versies bestaan die zijn geïnstalleerd in Windows en Linux. De implementaties zijn gescheiden. Er is echter geen conflictdetectie tussen DSC-versies, dus probeer niet dezelfde instellingen te beheren.

Volgende stappen