Udostępnij za pośrednictwem


Zasób skryptu DSC

Dotyczy: Windows PowerShell 4.0, Windows PowerShell 5.x

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

Napiwek

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 Script jest właściwością 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ływanego w systemie docelowym.

Przed użyciem zasobu Script zastanów się, 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.

Nuta

Ta dokumentacja tego zasobu DSC obejmuje wersję dołączoną do programu PowerShell przed wersją 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 galerii programu PowerShell.

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

Składnia

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

Nuta

bloki GetScriptTestScripti SetScript są przechowywane jako ciągi.

Właściwości

Własność Opis
GetScript Blok skryptu, który zwraca bieżący stan węzła.
SetScript Blok skryptu używany przez rozszerzenie DSC do wymuszania zgodności, gdy węzeł nie jest w żądanym stanie.
TestScript Blok skryptu, który określa, czy węzeł jest w żądanym stanie.
Poświadczeń Wskazuje poświadczenia do użycia na potrzeby uruchamiania tego skryptu, jeśli są wymagane poświadczenia.

Typowe właściwości

Własność 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.

Nuta

Właściwość wspólna 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.

Dodatkowe informacje

GetScript

Rozszerzenie DSC nie używa danych wyjściowych z GetScript polecenie cmdlet Get-DscConfiguration get-DscConfiguration wykonuje GetScript w celu pobrania bieżącego stanu węzła. Wartość zwracana nie jest wymagana z GetScript Jeśli określisz wartość zwracaną, musi to być tabela skrótowa zawierająca klucz Result, którego wartość jest ciągiem.

TestScript

Rozszerzenie DSC wykonuje TestScript w celu określenia, czy SetScript należy uruchomić. Jeśli TestScript zwraca $false, rozszerzenie DSC wykonuje SetScript, aby przywrócić żądany stan węzła. Musi zwrócić wartość logiczną. Wynik $true wskazuje, że węzeł jest zgodny i SetScript nie powinien być wykonywany.

Polecenie cmdlet Test-DscConfiguration wykonuje w celu pobrania zgodności węzłów z zasobami . Jednak w tym przypadku SetScript nie działa, niezależnie od tego, co TestScript blok zwraca.

Nuta

Wszystkie dane wyjściowe z TestScript są częścią jego wartości zwracanej. Program PowerShell interpretuje nieskompresowane dane wyjściowe jako niezerowe, co oznacza, że TestScript zwraca $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ł w celu wymuszenia żądanego stanu. Rozszerzenie DSC wywołuje SetScript, jeśli blok skryptu TestScript zwraca $false. SetScript nie powinna mieć wartości zwracanej.

Przykłady

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

W tym przykładzie testuje istnienie C:\TempFolder\TestFile.txt w każdym węźle. Jeśli nie istnieje, tworzy go przy użyciu SetScript. GetScript zwraca 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 wersji zgodnej z pliku tekstowego na komputerze tworzenia i zapisuje je w zmiennej $version. Podczas generowania pliku MOF węzła DSC zastępuje zmienne $using:version 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 podczas kolejnych wykonań.

$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

Ten przykład uzyskuje dostęp do parametrów z poziomu zasobu Skrypt, korzystając z zakresu using. ConfigurationData można uzyskać dostęp 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 zakresu using. 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 ramach zasobu 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.