Condividi tramite


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 di script di Windows PowerShell nei nodi di destinazione. La risorsa Script usa GetScriptSetScripte TestScript proprietà che contengono blocchi di script definiti per eseguire le operazioni di stato DSC corrispondenti.

Mancia

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

A differenza di altre risorse DSC, ogni proprietà per una risorsa Script è 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 funzioni 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 risorsa Script, 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 in PowerShell Gallery.

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

Sintassi

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

Nota

GetScript TestScripte i blocchi di 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 di questo script, se sono necessarie le credenziali.

Proprietà comuni

Proprietà Descrizione
DependsOn Indica che la configurazione di un'altra risorsa deve essere eseguita prima della configurazione di questa risorsa.
PsDscRunAsCredential Imposta le credenziali per l'esecuzione dell'intera risorsa come .

Nota

La PsDscRunAsCredential proprietà comune è 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 di Il cmdlet Get-DscConfiguration esegue per recuperare lo stato corrente di un nodo. Un valore restituito non è obbligatorio da Se si specifica un valore restituito, deve essere una tabella hash contenente una chiave result il cui valore è String.

TestScript

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

Il cmdlet Test-DscConfiguration esegue per recuperare la conformità dei nodi alle risorse . Tuttavia, in questo caso, SetScript non viene eseguito, indipendentemente dal TestScript blocco restituito.

Nota

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

SetScript

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

Esempi

Esempio 1: Scrivere testo di esempio usando una risorsa Script

In questo esempio viene verificata l'esistenza di C:\TempFolder\TestFile.txt in ogni nodo. Se non esiste, lo crea usando il SetScript. Il GetScript restituisce 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 usando una risorsa Script

Questo esempio recupera le informazioni sulla versione conformi da un file di testo nel computer di creazione e lo archivia nella variabile $version. Quando si genera il 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 dei parametri in una risorsa Script

Questo esempio accede ai parametri dall'interno della risorsa Script usando l'ambito using. ConfigurationData è accessibile 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, disaccoppiando 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 accessibili 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. Usare una risorsa completa anziché usare una risorsa script in questo caso.