Risorse composite: uso di una configurazione DSC come risorsaComposite resources: Using a DSC configuration as a resource

Si applica a: Windows PowerShell 4.0, Windows PowerShell 5.0Applies To: Windows PowerShell 4.0, Windows PowerShell 5.0

In situazioni reali, le configurazioni possono diventare lunghe e complesse, includere chiamate a molte risorse diverse e richiedere l'impostazione di un elevato numero di proprietà.In real-world situations, configurations can become long and complex, calling many different resources and setting a vast number of properties. Per risolvere questa complessità, è possibile usare una configurazione di Windows PowerShell DSC (Desired State Configuration) come risorsa per altre configurazioni.To help address this complexity, you can use a Windows PowerShell Desired State Configuration (DSC) configuration as a resource for other configurations. In questo caso si parla di risorsa composita.This is called a composite resource. Una risorsa composita è una configurazione DSC che accetta parametri.A composite resource is a DSC configuration that takes parameters. I parametri della configurazione fungono da proprietà della risorsa.The parameters of the configuration act as the properties of the resource. La configurazione viene salvata come file con estensione .schema.psm1.The configuration is saved as a file with a .schema.psm1 extension. Sostituisce sia lo schema MOF che lo script di risorsa in una risorsa DSC tipica.It takes the place of both the MOF schema, and the resource script in a typical DSC resource. Per altre informazioni sulle risorse DSC, vedere Creare risorse Windows PowerShell DSC (Desired State Configuration) personalizzate.For more information about DSC resources, see Windows PowerShell Desired State Configuration Resources.

Creazione della risorsa compositaCreating the composite resource

In questo esempio viene creata una configurazione che richiama diverse risorse esistenti per configurare le macchine virtuali.In our example, we create a configuration that invokes a number of existing resources to configure virtual machines. Invece di specificare i valori da impostare in blocchi di configurazione, la configurazione accetta parametri che vengono quindi usati nei blocchi di configurazione.Instead of specifying the values to be set in configuration blocks, the configuration takes in parameters that are then used in the configuration blocks.

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

Nota

DSC attualmente non supporta l'inserimento di risorse composite o di configurazioni annidate all'interno di una risorsa composita.DSC doesn't currently support placing composite resources or nested configurations within a composite resource.

Salvataggio della configurazione come risorsa compositaSaving the configuration as a composite resource

Per usare la configurazione con parametri come risorsa DSC, salvarla in una struttura di directory come quella di qualsiasi altra risorsa basata su MOF e denominarla con estensione .schema.psm1.To use the parameterized configuration as a DSC resource, save it in a directory structure like that of any other MOF-based resource, and name it with a .schema.psm1 extension. In questo esempio il file viene denominato xVirtualMachine.schema.psm1.For this example, we'll name the file xVirtualMachine.schema.psm1. È anche necessario creare un manifesto denominato xVirtualMachine.psd1 che contiene la riga seguente.You also need to create a manifest named xVirtualMachine.psd1 that contains the following line.

RootModule = 'xVirtualMachine.schema.psm1'

Nota

Tutto ciò si aggiunge a MyDscResources.psd1, il manifesto del modulo per tutte le risorse nella cartella MyDscResources.This is in addition to MyDscResources.psd1, the module manifest for all resources under the MyDscResources folder.

Al termine, la struttura di cartelle deve essere simile a quella illustrata di seguito.When you are done, the folder structure should be as follows.

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

La risorsa è ora individuabile usando il cmdlet Get-DscResource e le sue proprietà sono individuabili usando tale cmdlet oppure il completamento automatico con CTRL+BARRA SPAZIATRICE in Windows PowerShell ISE.The resource is now discoverable by using the Get-DscResource cmdlet, and its properties are discoverable by either that cmdlet or by using Ctrl+Space autocomplete in the Windows PowerShell ISE.

Uso della risorsa compositaUsing the composite resource

Verrà quindi creata una configurazione che chiama la risorsa composita.Next we create a configuration that calls the composite resource. Questa configurazione chiama la risorsa composita xVirtualMachine per creare una macchina virtuale e quindi chiama la risorsa xComputer per rinominarla.This configuration calls the xVirtualMachine composite resource to create a virtual machine, and then calls the xComputer resource to rename it.

configuration RenameVM
{
    Import-DscResource -Module xVirtualMachine
    Node localhost
    {
        xVirtualMachine VM
        {
            VMName = "Test"
            SwitchName = "Internal"
            SwitchType = "Internal"
            VhdParentPath = "C:\Demo\VHD\RTM.vhd"
            VHDPath = "C:\Demo\VHD"
            VMStartupMemory = 1024MB
            VMState = "Running"
        }
    }

    Node "192.168.10.1"
    {
        xComputer Name
        {
            Name = "SQL01"
            DomainName = "fourthcoffee.com"
        }
    }
}

È anche possibile usare questa risorsa per creare più macchine virtuali passando una matrice di nomi di VM alla risorsa xVirtualMachine.You can also use this resource to create multiple VMs by passing in an array of VM names to the xVirtualMachine resource.

Configuration MultipleVms
{
    Import-DscResource -Module xVirtualMachine
    Node localhost
    {
        xVirtualMachine VMs
        {
            VMName = "IIS01", "SQL01", "SQL02"
            SwitchName = "Internal"
            SwitchType = "Internal"
            VhdParentPath = "C:\Demo\VHD\RTM.vhd"
            VHDPath = "C:\Demo\VHD"
            VMStartupMemory = 1024MB
            VMState = "Running"
        }
    }
}

Supporto di PsDscRunAsCredentialSupporting PsDscRunAsCredential

Nota

PsDscRunAsCredential è supportato in PowerShell 5.0 e versioni successive.PsDscRunAsCredential is supported in PowerShell 5.0 and later.

La proprietà PsDscRunAsCredential può essere usata nel blocco di risorsa delle configurazioni DSC per specificare che la risorsa deve essere eseguita in un insieme di credenziali specificato.The PsDscRunAsCredential property can be used in DSC configurations resource block to specify that the resource should be run under a specified set of credentials. Per altre informazioni, vedere Esecuzione di DSC con le credenziali dell'utente.For more information, see Running DSC with user credentials.

Per accedere al contesto utente dall'interno di una risorsa personalizzata è possibile usare la variabile automatica $PsDscContext.To access the user context from within a custom resource, you can use the automatic variable $PsDscContext.

Ad esempio il codice seguente scrive il contesto utente in cui viene eseguita la risorsa nel flusso di output dettagliato:For example, the following code would write the user context under which the resource is running to the verbose output stream:

if ($PsDscContext.RunAsUser) {
    Write-Verbose "User: $PsDscContext.RunAsUser";
}

Vedere ancheSee Also

ConcettiConcepts