Freigeben über


Erstellen einer zusammengesetzten DSC-Ressource

In realen Situationen können DSC-Konfigurationen lang und komplex werden, indem mehrere verschiedene DSC-Ressourcen aufgerufen und Dutzende von Eigenschaften festgelegt werden. Um diese Komplexität zu beheben, können Sie eine DSC-Konfiguration als DSC-Ressource für andere DSC-Konfigurationen verwenden. Dies wird als zusammengesetzte DSC-Ressource bezeichnet. Eine zusammengesetzte DSC-Ressource ist eine DSC-Konfiguration, die Parameter akzeptiert. Die Parameter der DSC-Konfiguration fungieren als Eigenschaften der DSC-Ressource. Die DSC-Konfiguration wird als Datei mit einer .schema.psm1 Erweiterung gespeichert. Weitere Informationen zu DSC-Ressourcen finden Sie unter DSC-Ressourcen.

Wichtig

Zusammengesetzte DSC-Ressourcen funktionieren nicht mit Invoke-DscResource. In DSC 2.0 und höher werden sie nur für die Verwendung mit dem Computerkonfigurationsfeature von Azure Automanage unterstützt.

Erstellen der zusammengesetzten Ressource

In unserem Beispiel erstellen wir eine Konfiguration, die mehrere vorhandene Ressourcen aufruft, um virtuelle Computer zu konfigurieren. Anstatt die festzulegenden Werte in Konfigurationsblöcken anzugeben, verwendet die Konfiguration Parameter, die anschließend in den Konfigurationsblöcken verwendet werden.

Configuration xVirtualMachine {
    param(
        # Name of VMs
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [String[]] $VMName,

        # Name of Switch to create
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [String] $SwitchName,

        # Type of Switch to create
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [String] $SwitchType,

        # Source Path for VHD
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [String] $VHDParentPath,

        # Destination path for diff VHD
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [String] $VHDPath,

        # Startup Memory for VM
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [String] $VMStartupMemory,

        # State of the VM
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [String] $VMState
    )

    # Import the module that defines custom resources
    Import-DSCResource -ModuleName xComputerManagement, xHyper-V

    # Install the Hyper-V role
    WindowsFeature HyperV {
        Ensure = 'Present'
        Name   = 'Hyper-V'
    }

    # Create the virtual switch
    xVMSwitch $SwitchName {
        Ensure    = 'Present'
        Name      = $SwitchName
        Type      = $SwitchType
        DependsOn = '[WindowsFeature]HyperV'
    }

    # Check for Parent VHD file
    File ParentVHDFile {
        Ensure          = 'Present'
        DestinationPath = $VHDParentPath
        Type            = 'File'
        DependsOn       = '[WindowsFeature]HyperV'
    }

    # Check the destination VHD folder
    File VHDFolder {
        Ensure          = 'Present'
        DestinationPath = $VHDPath
        Type            = 'Directory'
        DependsOn       = '[File]ParentVHDFile'
    }

    # Create VM specific diff VHD
    foreach ($Name in $VMName) {
        xVHD "VHD$Name" {
            Ensure     = 'Present'
            Name       = $Name
            Path       = $VHDPath
            ParentPath = $VHDParentPath
            DependsOn  = @(
                '[WindowsFeature]HyperV'
                '[File]VHDFolder'
            )
        }
    }

    # Create VM using the above VHD
    foreach($Name in $VMName) {
        xVMHyperV "VMachine$Name" {
            Ensure        = 'Present'
            Name          = $Name
            VhdPath       = (Join-Path -Path $VHDPath -ChildPath $Name)
            SwitchName    = $SwitchName
            StartupMemory = $VMStartupMemory
            State         = $VMState
            MACAddress    = $MACAddress
            WaitForIP     = $true
            DependsOn     = @(
                "[WindowsFeature]HyperV"
                "[xVHD]VHD$Name"
            )
        }
    }
}

Hinweis

DSC unterstützt nicht das Platzieren zusammengesetzter DSC-Ressourcenblöcke innerhalb einer zusammengesetzten DSC-Ressourcendefinition.

Speichern der DSC-Konfiguration als zusammengesetzte DSC-Ressource

Um die parametrisierte DSC-Konfiguration als DSC-Ressource zu verwenden, speichern Sie sie in einer Verzeichnisstruktur wie der einer MOF-basierten DSC-Ressource, und benennen Sie sie mit einer .schema.psm1 Erweiterung. In diesem Beispiel erhält die Datei die Bezeichnung xVirtualMachine.schema.psm1. Sie müssen außerdem ein Manifest mit dem Namen xVirtualMachine.psd1 erstellen, das die folgende Zeile enthält.

RootModule = 'xVirtualMachine.schema.psm1'

Hinweis

Dies ist getrennt vom MyDscResources.psd1Modulmanifest für alle DSC-Ressourcen unter dem MyDscResources Ordner.

Wenn Sie fertig sind, sollte die Ordnerstruktur wie folgt aussehen:

$env: psmodulepath
    |- MyDscResources
        |- MyDscResources.psd1
        |- DSCResources
            |- xVirtualMachine
                |- xVirtualMachine.psd1
                |- xVirtualMachine.schema.psm1

Die DSC-Ressource kann jetzt mit dem Get-DscResource Cmdlet ermittelt werden, und ihre Eigenschaften können entweder mit diesem Cmdlet oder mit strg+space autovervollständigen in VS Code ermittelt werden.

Verwenden der zusammengesetzten Ressource

Als Nächstes erstellen wir eine DSC-Konfiguration, die die zusammengesetzte DSC-Ressource aufruft. Diese DSC-Konfiguration ruft die xVirtualMachine zusammengesetzte DSC-Ressource auf, um einen virtuellen Computer zu erstellen.

Configuration CreateVM {
    Import-DSCResource -ModuleName xVirtualMachine

    xVirtualMachine VM {
        VMName          = "Test"
        SwitchName      = "Internal"
        SwitchType      = "Internal"
        VhdParentPath   = "C:\Demo\VHD\RTM.vhd"
        VHDPath         = "C:\Demo\VHD"
        VMStartupMemory = 1024MB
        VMState         = "Running"
    }
}

Sie können diese zusammengesetzte DSC-Ressource auch verwenden, um mehrere VMs zu erstellen, indem Sie ein Array von VM-Namen für die VMName-Eigenschaft der zusammengesetzten DSC-Ressource übergeben.

Configuration MultipleVms {
    Import-DSCResource -ModuleName xVirtualMachine

    xVirtualMachine VMs {
        VMName          = @(
            "IIS01"
            "SQL01"
            "SQL02"
        )
        SwitchName      = "Internal"
        SwitchType      = "Internal"
        VhdParentPath   = "C:\Demo\VHD\RTM.vhd"
        VHDPath         = "C:\Demo\VHD"
        VMStartupMemory = 1024MB
        VMState         = "Running"
    }
}

Weitere Informationen