DSC-skriptresurs
Gäller för: Windows PowerShell 4.0, Windows PowerShell 5.x
Den Script
resursen i Windows PowerShell Desired State Configuration (DSC) tillhandahåller en mekanism för att köra Windows PowerShell-skriptblock på målnoder. Den Script
resursen använder GetScript
SetScript
och TestScript
egenskaper som innehåller skriptblock som du definierar för att utföra motsvarande DSC-tillståndsåtgärder.
Dricks
Där det är möjligt är det bästa praxis att använda en definierad DSC-resurs i stället för den här. Den Script
resursen har nackdelar som gör det svårare att testa, underhålla och förutsäga.
Till skillnad från andra DSC-resurser är varje egenskap för en Script
resurs en nyckelegenskap och metoden Get för den här resursen kan bara returnera en enda sträng för det aktuella tillståndet. Det finns inga garantier för att den här resursen implementeras idempotently eller att den fungerar som förväntat på alla system eftersom den använder anpassad kod. Det kan inte testas utan att anropas i ett målsystem.
Innan du använder den Script
resursen bör du överväga om du kan skapa en resurs i stället.
Om du använder väldefinierade DSC-resurser blir dina konfigurationer mer läsbara och underhållsbara.
Not
Den här dokumentationen för den här DSC-resursen omfattar den version som ingår i PowerShell före version 7.2. Modulen PSDscResources innehåller nya och uppdaterade DSC-resurser som stöds officiellt av Microsoft. Modulen PSDscResources är tillgänglig från PowerShell-galleriet.
Mer information och uppdaterad dokumentation finns i referensdokumentationen PSDscResources.
Syntax
Script [string] #ResourceName
{
GetScript = [string]
SetScript = [string]
TestScript = [string]
[ Credential = [PSCredential] ]
[ DependsOn = [string[]] ]
[ PsDscRunAsCredential = [PSCredential] ]
}
Not
GetScript
TestScript
, och SetScript
block lagras som strängar.
Egenskaper
Egenskap | Beskrivning |
---|---|
GetScript | Ett skriptblock som returnerar nodens aktuella tillstånd. |
SetScript | Ett skriptblock som DSC använder för att framtvinga efterlevnad när noden inte är i önskat tillstånd. |
TestScript | Ett skriptblock som avgör om noden är i önskat tillstånd. |
Referens | Anger de autentiseringsuppgifter som ska användas för att köra det här skriptet, om autentiseringsuppgifter krävs. |
Vanliga egenskaper
Egenskap | Beskrivning |
---|---|
DependsOn | Anger att konfigurationen av en annan resurs måste köras innan den här resursen har konfigurerats. |
PsDscRunAsCredential | Anger autentiseringsuppgifterna för att köra hela resursen som. |
Not
PsDscRunAsCredential gemensamma egenskapen lades till i WMF 5.0 för att tillåta körning av DSC-resurser i kontexten för andra autentiseringsuppgifter. Mer information finns i Använda autentiseringsuppgifter med DSC-resurser.
Ytterligare information
GetScript
DSC använder inte utdata från GetScript
Cmdleten Get-DscConfigur ation kör GetScript
för att hämta en nods aktuella tillstånd. Ett returvärde krävs inte från GetScript
Om du anger ett returvärde måste det vara en hashtabell som innehåller en Resultat nyckel vars värde är en Sträng.
TestScript
DSC kör TestScript
för att avgöra om SetScript
ska köras. Om TestScript
returnerar $false
kör DSC SetScript
för att återställa noden till önskat tillstånd. Det måste returnera ett booleskt värde. Ett resultat av $true
anger att noden är kompatibel och SetScript
inte ska köras.
Cmdleten Test-DscConfiguration kör TestScript
för att hämta nodernas kompatibilitet med Script
resurser. Men i det här fallet körs inte SetScript
, oavsett vilken TestScript
block returnerar.
Not
Alla utdata från din TestScript
är en del av dess returvärde. PowerShell tolkar oövertryckta utdata som icke-noll, vilket innebär att din TestScript
returnerar $true
oavsett nodens tillstånd. Detta resulterar i oförutsägbara resultat, falska positiva identifieringar och orsakar problem under felsökningen.
SetScript
SetScript
ändrar noden för att framtvinga önskat tillstånd. DSC anropar SetScript
om TestScript
-skriptblocket returnerar $false
.
SetScript
ska inte ha något returvärde.
Exempel
Exempel 1: Skriva exempeltext med hjälp av en skriptresurs
I det här exemplet testas förekomsten av C:\TempFolder\TestFile.txt
på varje nod. Om den inte finns skapas den med hjälp av SetScript
.
GetScript
returnerar innehållet i filen och dess returvärde används inte.
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) } }
}
}
}
Exempel 2: Jämför versionsinformation med hjälp av en skriptresurs
Det här exemplet hämtar kompatibel versionsinformation från en textfil på redigeringsdatorn och lagrar den i variabeln $version
. När du genererar nodens MOF-fil ersätter DSC de $using:version
variablerna i varje skriptblock med värdet för variabeln $version
. Under körningen lagras kompatibel version i en textfil på varje nod och jämförs och uppdateras vid efterföljande körningar.
$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')
}
}
}
}
Exempel 3: Använda parametrar i en skriptresurs
Det här exemplet kommer åt parametrar inifrån skriptresursen genom att använda using
omfång.
ConfigurationData kan nås på ett liknande sätt. Precis som i exempel 2 förväntar sig implementeringen att en version lagras i en lokal fil på målnoden. Både den lokala sökvägen och versionen kan konfigureras, vilket avkodar kod från konfigurationsdata.
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
}
}
}
}
Den resulterande MOF-filen innehåller variablerna och deras värden som nås via using
omfång.
De matas in i varje scriptblock, som använder variablerna. Test- och set-skript tas bort för korthet:
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 = ...;
};
Kända begränsningar
- Autentiseringsuppgifter som skickas i en skriptresurs är inte alltid tillförlitliga när du använder en pull- eller push-servermodell. Använd en fullständig resurs i stället för att använda en skriptresurs i det här fallet.