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 GetScript
SetScript
i 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 GetScript
TestScript
i 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 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.