创作复合 DSC 资源

在实际情况下,DSC 配置可能会变得漫长而复杂,需要调用多个不同的 DSC 资源并设置数十个属性。 为了帮助解决这种复杂性,可以将 DSC 配置用作其他 DSC 配置的 DSC 资源。 这称为复合 DSC 资源。 复合 DSC 资源是采用参数的 DSC 配置。 DSC 配置的参数充当 DSC 资源的属性。 DSC 配置保存为扩展名的文件 .schema.psm1 。 有关 DSC 资源的详细信息,请参阅 DSC 资源

重要

复合 DSC 资源不适用于 Invoke-DscResource。 在 DSC 2.0 及更高版本中,它们仅支持与 Azure Automanage 的计算机配置功能配合使用。

创建复合资源

在我们的示例中,我们将创建一个配置,该配置调用多个现有资源来配置虚拟机。 配置采用了之后将在配置块中使用的参数,而没有指定应该在配置块中设置的值。

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"
            )
        }
    }
}

注意

DSC 不支持在复合 DSC 资源定义中放置复合 DSC 资源块。

将 DSC 配置另存为复合 DSC 资源

若要将参数化 DSC 配置用作 DSC 资源,请将其保存在目录结构(如 基于 MOF 的 DSC 资源的目录结构中),并使用扩展将其 .schema.psm1 命名。 在此示例中,我们将文件命名为 xVirtualMachine.schema.psm1。 你还需要创建一个名为 xVirtualMachine.psd1 并包含下列行的清单。

RootModule = 'xVirtualMachine.schema.psm1'

注意

这独立于 MyDscResources.psd1文件夹下 MyDscResources 所有 DSC 资源的模块清单。

完成操作后,文件夹结构应如下所示。

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

DSC 资源现在可通过 Get-DscResource cmdlet 发现,其属性可通过该 cmdlet 或 VS Code 中的 Ctrl+Space 自动完成来发现。

使用复合资源

接下来,我们将创建一个 DSC 配置,用于调用复合 DSC 资源。 此 DSC 配置调用 xVirtualMachine 复合 DSC 资源来创建虚拟机。

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

还可以使用此复合 DSC 资源通过为复合 DSC 资源的 VMName 属性传入 VM 名称数组来创建多个 VM。

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

另请参阅