Risorsa Script DSC

Si applica a: Windows PowerShell 4.0, Windows PowerShell 5.x

La risorsa Script in Windows PowerShell DSC (Desired State Configuration) fornisce un meccanismo per eseguire blocchi script di Windows PowerShell nei nodi di destinazione. La risorsa Script usa le proprietà GetScript,SetScript e TestScript che contengono blocchi di script definiti per eseguire le operazioni per lo stato DSC corrispondente.

Suggerimento

Laddove possibile, è consigliabile usare una risorsa DSC definita anziché questa. La Script risorsa presenta svantaggi che rendono più difficile testare, gestire e prevedere.

A differenza di altre risorse DSC, ogni proprietà per una Script risorsa è una proprietà chiave e il metodo Get per questa risorsa può restituire solo una singola stringa per lo stato corrente. Non ci sono garanzie che questa risorsa venga implementata in modo idempotente o che funzionerà come previsto in qualsiasi sistema perché usa codice personalizzato. Non può essere testato senza essere richiamato in un sistema di destinazione.

Prima di usare la Script risorsa, valutare se è possibile creare una risorsa . L'uso di risorse DSC ben definite rende le configurazioni più leggibili e gestibili.

Nota

Questa documentazione di questa risorsa DSC illustra la versione inclusa in PowerShell prima della versione 7.2. Il modulo PSDscResources contiene risorse DSC nuove e aggiornate supportate ufficialmente da Microsoft. Il modulo PSDscResources è disponibile da PowerShell Gallery.

Per altre informazioni e la documentazione aggiornata, vedere la documentazione di riferimento di PSDscResources.

Sintassi

Script [string] #ResourceName
{
    GetScript = [string]
    SetScript = [string]
    TestScript = [string]
    [ Credential = [PSCredential] ]
    [ DependsOn = [string[]] ]
    [ PsDscRunAsCredential = [PSCredential] ]
}

Nota

GetScriptTestScripti blocchi e SetScript vengono archiviati come stringhe.

Proprietà

Proprietà Descrizione
GetScript Blocco di script che restituisce lo stato corrente del nodo.
SetScript Blocco di script usato da DSC per applicare la conformità quando il nodo non è nello stato desiderato.
TestScript Blocco di script che determina se il nodo è nello stato desiderato.
Credenziale Indica le credenziali da usare per l'esecuzione dello script, se sono necessarie credenziali.

Proprietà comuni

Proprietà Descrizione
DependsOn Indica che prima di configurare la risorsa è necessario eseguire la configurazione di un'altra risorsa.
PsDscRunAsCredential Imposta le credenziali per l'esecuzione dell'intera risorsa.

Nota

La proprietà comune PsDscRunAsCredential è stata aggiunta in WMF 5.0 per consentire l'esecuzione di qualsiasi risorsa DSC nel contesto di altre credenziali. Per altre informazioni, vedere Usare credenziali con risorse DSC.

Informazioni aggiuntive

GetScript

DSC non usa l'output del GetScript cmdlet Get-DscConfiguration eseguito GetScript per recuperare lo stato corrente di un nodo. Un valore restituito non è obbligatorio da GetScript Se si specifica un valore restituito, deve essere una tabella hash contenente una chiave Result il cui valore è String.

TestScript

DSC viene eseguito TestScript per determinare se SetScript deve essere eseguito. Se TestScript restituisce $false, DSC esegue SetScript per riportare il nodo allo stato desiderato. Deve restituire un valore booleano. Un risultato indica $true che il nodo è conforme e SetScript non deve essere eseguito.

Il cmdlet Test-DscConfiguration viene eseguito TestScript per recuperare la conformità dei nodi alle Script risorse. In questo caso, tuttavia, SetScript non viene eseguito, indipendentemente dal TestScript valore restituito dal blocco.

Nota

Tutto l'output restituito da TestScript fa parte del valore restituito. PowerShell interpreta l'output non compresso come diverso da zero, il che significa che restituisce TestScript$true indipendentemente dallo stato del nodo. Questo comportamento provoca risultati imprevedibili, falsi positivi e difficoltà durante la risoluzione dei problemi.

SetScript

SetScript modifica il nodo per applicare lo stato desiderato. DSC chiama SetScript se il TestScript blocco di script restituisce $false. SetScript non deve avere alcun valore restituito.

Esempi

Esempio 1: Scrivere testo di esempio tramite una risorsa Script

Questo esempio testa la presenza di C:\TempFolder\TestFile.txt in ogni nodo. Se non esiste, lo crea usando .SetScript restituisce GetScript il contenuto del file e il relativo valore restituito non viene usato.

Configuration ScriptTest
{
    Import-DscResource -ModuleName 'PSDesiredStateConfiguration'

    Node localhost
    {
        Script ScriptExample
        {
            SetScript = {
                $sw = New-Object System.IO.StreamWriter("C:\TempFolder\TestFile.txt")
                $sw.WriteLine("Some sample string")
                $sw.Close()
            }
            TestScript = { Test-Path "C:\TempFolder\TestFile.txt" }
            GetScript = { @{ Result = (Get-Content C:\TempFolder\TestFile.txt) } }
        }
    }
}

Esempio 2: Confrontare le informazioni sulla versione tramite una risorsa Script

Questo esempio recupera informazioni sulla versione conforme da un file di testo nel computer di creazione e le archivia nella variabile $version. Durante la generazione del file MOF del nodo, DSC sostituisce le variabili $using:version in ogni blocco di script con il valore della variabile $version. Durante l'esecuzione, la versione conforme viene archiviata in un file di testo in ogni nodo e confrontata e aggiornata nelle esecuzioni successive.

$version = Get-Content 'version.txt'

Configuration ScriptTest
{
    Import-DscResource -ModuleName 'PSDesiredStateConfiguration'

    Node localhost
    {
        Script UpdateConfigurationVersion
        {
            GetScript = {
                $currentVersion = Get-Content (Join-Path -Path $env:SYSTEMDRIVE -ChildPath 'version.txt')
                return @{ 'Result' = "$currentVersion" }
            }
            TestScript = {
                # Create and invoke a scriptblock using the $GetScript automatic variable, which contains a string representation of the GetScript.
                $state = [scriptblock]::Create($GetScript).Invoke()

                if( $state.Result -eq $using:version )
                {
                    Write-Verbose -Message ('{0} -eq {1}' -f $state.Result,$using:version)
                    return $true
                }
                Write-Verbose -Message ('Version up-to-date: {0}' -f $using:version)
                return $false
            }
            SetScript = {
                $using:version | Set-Content -Path (Join-Path -Path $env:SYSTEMDRIVE -ChildPath 'version.txt')
            }
        }
    }
}

Esempio 3: Utilizzo di parametri in una risorsa Script

Questo esempio consente di accedere ai parametri all'interno della risorsa Script usando l'ambito using. È possibile accedere a ConfigurationData in modo analogo. Come nell'esempio 2, l'implementazione prevede che una versione venga archiviata all'interno di un file locale nel nodo di destinazione. Sia il percorso locale che la versione sono configurabili, separando il codice dai dati di configurazione.

Configuration ScriptTest
{
    param
    (
        [Version]
        $Version,

        [string]
        $FilePath
    )

    Import-DscResource -ModuleName 'PSDesiredStateConfiguration'

    Node localhost
    {
        Script UpdateConfigurationVersion
        {
            GetScript = {
                $currentVersion = Get-Content -Path $using:FilePath
                return @{ 'Result' = "$currentVersion" }
            }
            TestScript = {
                # Create and invoke a scriptblock using the $GetScript automatic variable,
                # which contains a string representation of the GetScript.
                $state = [scriptblock]::Create($GetScript).Invoke()

                if( $state['Result'] -eq $using:Version )
                {
                    Write-Verbose -Message ('{0} -eq {1}' -f $state['Result'],$using:version)
                    return $true
                }

                Write-Verbose -Message ('Version up-to-date: {0}' -f $using:version)
                return $false
            }
            SetScript = {
                Set-Content -Path $using:FilePath -Value $using:Version
            }
        }
    }
}

Il file MOF risultante include le variabili e i relativi valori a cui si accede tramite l'ambito using. Vengono inseriti in ogni blocco di script, che usa le variabili. Gli script di test e set vengono rimossi per brevità:

instance of MSFT_ScriptResource as $MSFT_ScriptResource1ref
{
 GetScript = "$FilePath ='C:\\Config.ini'\n\n $currentVersion = Get-Content -Path $FilePath\n return @{ 'Result' = \"$currentVersion\" }\n";
 TestScript = ...;
 SetScript = ...;
};

Limitazioni note

  • Le credenziali passate all'interno di una risorsa script non sono sempre affidabili quando si usa un modello di server pull o push. In questo caso, usare una risorsa completa anziché usare una risorsa script.