Zasób skryptu DSC

Dotyczy: Windows PowerShell 4.0, Windows PowerShell 5.x

Zasób Script w Windows PowerShell Desired State Configuration (DSC) udostępnia mechanizm uruchamiania bloków skryptów Windows PowerShell w węzłach docelowych. Zasób Script używa GetScriptSetScriptwłaściwości i TestScript , które zawierają bloki skryptu zdefiniowane do wykonywania odpowiednich operacji stanu DSC.

Porada

Jeśli to możliwe, najlepszym rozwiązaniem jest użycie zdefiniowanego zasobu DSC zamiast tego. Zasób Script ma wady, które utrudniają testowanie, konserwację i przewidywanie.

W przeciwieństwie do innych zasobów DSC każda właściwość zasobu jest właściwością Script klucza, a metoda Get dla tego zasobu może zwrócić tylko jeden ciąg dla bieżącego stanu. Nie ma gwarancji, że ten zasób jest implementowany idempotentnie lub że będzie działać zgodnie z oczekiwaniami w dowolnym systemie, ponieważ używa niestandardowego kodu. Nie można go przetestować bez wywoływana w systemie docelowym.

Przed użyciem Script zasobu rozważ, czy zamiast tego możesz utworzyć zasób . Użycie dobrze zdefiniowanych zasobów DSC sprawia, że konfiguracje są bardziej czytelne i możliwe do utrzymania.

Uwaga

Ta dokumentacja tego zasobu DSC obejmuje wersję dołączoną do programu PowerShell w wersji 7.2. Moduł PSDscResources zawiera nowe i zaktualizowane zasoby DSC, które są oficjalnie obsługiwane przez firmę Microsoft. Moduł PSDscResources jest dostępny w Galeria programu PowerShell.

Aby uzyskać więcej informacji i zaktualizować dokumentację, zobacz dokumentację referencyjną usługi PSDscResources.

Składnia

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

Uwaga

GetScriptTestScriptbloki i SetScript są przechowywane jako ciągi.

Właściwości

Właściwość Opis
Getscript Blok skryptu, który zwraca bieżący stan węzła.
SetScript Blok skryptu używany przez dsC do wymuszania zgodności, gdy węzeł nie jest w żądanym stanie.
TestScript Blok skryptu określający, czy węzeł jest w żądanym stanie.
Referencje Wskazuje poświadczenia do użycia do uruchamiania tego skryptu, jeśli wymagane są poświadczenia.

Wspólne właściwości

Właściwość Opis
Dependson Wskazuje, że konfiguracja innego zasobu musi zostać uruchomiona przed skonfigurowaniem tego zasobu.
PsDscRunAsCredential Ustawia poświadczenie na potrzeby uruchamiania całego zasobu jako.

Uwaga

Właściwość pospolita PsDscRunAsCredential została dodana w programie WMF 5.0, aby umożliwić uruchamianie dowolnego zasobu DSC w kontekście innych poświadczeń. Aby uzyskać więcej informacji, zobacz Use Credentials with DSC Resources (Używanie poświadczeń z zasobami DSC).

Dodatkowe informacje

Getscript

DsC nie używa danych wyjściowych GetScript polecenia GetScript cmdlet Get-DscConfiguration, aby pobrać bieżący stan węzła. Wartość zwracana nie jest wymagana z GetScript pola Jeśli określisz wartość zwracaną, musi to być tabela skrótu zawierająca klucz wynikowy , którego wartość jest ciągiem.

TestScript

Rozszerzenie DSC jest wykonywane TestScript w celu określenia, czy SetScript należy je uruchomić. Jeśli TestScript funkcja zwraca $falsewartość , usługa DSC wykonuje polecenie SetScript w celu przywrócenia węzła do żądanego stanu. Musi zwrócić wartość logiczną. Wynik $true wskazuje, że węzeł jest zgodny i SetScript nie powinien być wykonywany.

Polecenie cmdlet Test-DscConfiguration jest TestScript wykonywane w celu pobrania zgodności węzłów z zasobami Script . Jednak w tym przypadku nie działa, SetScript bez względu na to, co TestScript zwraca blok.

Uwaga

Wszystkie dane wyjściowe z twojej TestScript wartości zwracanej są częścią wartości zwracanej. Program PowerShell interpretuje nieskompresowane dane wyjściowe jako niezerowe, co oznacza, że TestScript zwracane są $true niezależnie od stanu węzła. Powoduje to nieprzewidywalne wyniki, wyniki fałszywie dodatnie i powodują trudności podczas rozwiązywania problemów.

SetScript

SetScript modyfikuje węzeł, aby wymusić żądany stan. Rozszerzenie DSC wywołuje, SetScript jeśli blok skryptu TestScript zwraca wartość $false. Wartość SetScript nie powinna być zwracana.

Przykłady

Przykład 1. Pisanie przykładowego tekstu przy użyciu zasobu Skrypt

W tym przykładzie sprawdza się istnienie każdego węzła C:\TempFolder\TestFile.txt . Jeśli nie istnieje, tworzy go przy użyciu elementu SetScript. Zwraca GetScript zawartość pliku, a jego wartość zwracana nie jest używana.

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

Przykład 2. Porównanie informacji o wersji przy użyciu zasobu skryptu

Ten przykład pobiera informacje o zgodnej wersji z pliku tekstowego na komputerze tworzenia i przechowuje je w zmiennej $version . Podczas generowania pliku MOF węzła DSC zastępuje $using:version zmienne w każdym bloku skryptu wartością zmiennej $version . Podczas wykonywania zgodna wersja jest przechowywana w pliku tekstowym w każdym węźle i porównywana i aktualizowana w kolejnych wykonaniach.

$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')
            }
        }
    }
}

Przykład 3. Użycie parametrów w zasobie skryptu

W tym przykładzie uzyskuje dostęp do parametrów z zasobu Skrypt, korzystając z using zakresu. Dostęp do pliku ConfigurationData można uzyskać w podobny sposób. Podobnie jak w przykładzie 2, implementacja oczekuje, że wersja będzie przechowywana wewnątrz pliku lokalnego w węźle docelowym. Zarówno ścieżka lokalna, jak i wersja są konfigurowalne, co umożliwia oddzielenie kodu od danych konfiguracji.

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

Wynikowy plik MOF zawiera zmienne i ich wartości dostępne za pośrednictwem using zakresu. Są one wstrzykiwane do każdego bloku skryptów, który używa zmiennych. Skrypty testowania i ustawiania są usuwane w celu zwięzłości:

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 = ...;
};

Znane ograniczenia

  • Poświadczenia przekazywane w zasobie skryptu nie zawsze są niezawodne podczas korzystania z modelu ściągania lub wypychania serwera. W tym przypadku należy użyć pełnego zasobu, a nie użyć zasobu skryptu.