DSC-scriptresource
Van toepassing op: Windows PowerShell 4.0, Windows PowerShell 5.x
De Script
resource in Windows PowerShell Desired State Configuration (DSC) biedt een mechanisme voor het uitvoeren van Windows PowerShell-scriptblokken op doelknooppunten. De Script
-resource maakt gebruik van GetScript
SetScript
en TestScript
eigenschappen die scriptblokken bevatten die u definieert om de bijbehorende DSC-statusbewerkingen uit te voeren.
Fooi
Waar mogelijk is het raadzaam om een gedefinieerde DSC-resource te gebruiken in plaats van deze. De Script
resource heeft nadelen die het moeilijker maken om te testen, te onderhouden en te voorspellen.
In tegenstelling tot andere DSC-resources is elke eigenschap voor een Script
-resource een sleuteleigenschap en kan de methode Get voor deze resource slechts één tekenreeks retourneren voor de huidige status. Er zijn geen garanties dat deze resource idempotent wordt geïmplementeerd of dat deze werkt zoals verwacht op elk systeem omdat er aangepaste code wordt gebruikt. Het kan niet worden getest zonder aan te roepen op een doelsysteem.
Voordat u de Script
-resource gebruikt, moet u overwegen of u in plaats daarvan een resource kunt maken.
Door goed gedefinieerde DSC-resources te gebruiken, zijn uw configuraties beter leesbaar en onderhoudbaar.
Notitie
Deze documentatie van deze DSC-resource heeft betrekking op de versie die is opgenomen in PowerShell vóór versie 7.2. De PSDscResources-module bevat nieuwe en bijgewerkte DSC-resources die officieel worden ondersteund door Microsoft. De PSDscResources module is beschikbaar in de PowerShell Gallery.
Zie de referentiedocumentatie voor PSDscResourcesvoor meer informatie en bijgewerkte documentatie.
Syntaxis
Script [string] #ResourceName
{
GetScript = [string]
SetScript = [string]
TestScript = [string]
[ Credential = [PSCredential] ]
[ DependsOn = [string[]] ]
[ PsDscRunAsCredential = [PSCredential] ]
}
Notitie
GetScript
TestScript
en SetScript
blokken worden opgeslagen als tekenreeksen.
Eigenschappen
Eigenschap | Beschrijving |
---|---|
GetScript | Een scriptblok dat de huidige status van het knooppunt retourneert. |
SetScript | Een scriptblok dat DSC gebruikt om naleving af te dwingen wanneer het knooppunt niet de gewenste status heeft. |
TestScript | Een scriptblok dat bepaalt of het knooppunt de gewenste status heeft. |
Geloofsbrief | Geeft de referenties aan die moeten worden gebruikt voor het uitvoeren van dit script, als referenties vereist zijn. |
Algemene eigenschappen
Eigenschap | Beschrijving |
---|---|
DependsOn | Geeft aan dat de configuratie van een andere resource moet worden uitgevoerd voordat deze resource is geconfigureerd. |
PsDscRunAsCredential | Hiermee stelt u de referentie in voor het uitvoeren van de hele resource als. |
Notitie
De PsDscRunAsCredential algemene eigenschap is toegevoegd in WMF 5.0 om het uitvoeren van een DSC-resource in de context van andere referenties toe te staan. Zie Referenties gebruiken met DSC-resourcesvoor meer informatie.
Aanvullende informatie
GetScript
DSC gebruikt niet de uitvoer van GetScript
De Get-DscConfiguration-cmdlet voert GetScript
uit om de huidige status van een knooppunt op te halen. Een retourwaarde is niet vereist voor GetScript
Als u een retourwaarde opgeeft, moet deze een hashtabel zijn met een resultaat sleutel waarvan de waarde een tekenreeks is.
TestScript
DSC voert TestScript
uit om te bepalen of SetScript
moet worden uitgevoerd. Als TestScript
$false
retourneert, voert DSC SetScript
uit om het knooppunt terug te brengen naar de gewenste status. Er moet een Booleaanse waarde worden geretourneerd. Een resultaat van $true
geeft aan dat het knooppunt compatibel is en SetScript
niet mag worden uitgevoerd.
De cmdlet Test-DscConfiguration voert TestScript
uit om de knooppunten op te halen die voldoen aan de Script
resources. In dit geval wordt SetScript
echter niet uitgevoerd, ongeacht wat TestScript
blok retourneert.
Notitie
Alle uitvoer van uw TestScript
maakt deel uit van de retourwaarde. PowerShell interpreteert niet-gecomprimeerde uitvoer als niet-nul, wat betekent dat uw TestScript
$true
retourneert, ongeacht de status van het knooppunt. Dit resulteert in onvoorspelbare resultaten, fout-positieven en veroorzaakt problemen tijdens het oplossen van problemen.
SetScript
SetScript
wijzigt het knooppunt om de gewenste status af te dwingen. DSC roept SetScript
aan als het TestScript
scriptblok $false
retourneert. De SetScript
mag geen retourwaarde hebben.
Voorbeelden
Voorbeeld 1: Voorbeeldtekst schrijven met behulp van een scriptresource
In dit voorbeeld wordt getest op het bestaan van C:\TempFolder\TestFile.txt
op elk knooppunt. Als deze niet bestaat, wordt deze gemaakt met behulp van de SetScript
. De GetScript
retourneert de inhoud van het bestand en de retourwaarde wordt niet gebruikt.
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) } }
}
}
}
Voorbeeld 2: Versie-informatie vergelijken met behulp van een scriptresource
In dit voorbeeld worden de compatibele versiegegevens opgehaald uit een tekstbestand op de ontwerpcomputer en opgeslagen in de variabele $version
. Bij het genereren van het MOF-bestand van het knooppunt vervangt DSC de $using:version
variabelen in elk scriptblok door de waarde van de $version
variabele. Tijdens de uitvoering wordt de conforme-versie opgeslagen in een tekstbestand op elk knooppunt en vergeleken en bijgewerkt bij volgende uitvoeringen.
$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')
}
}
}
}
Voorbeeld 3: Parameters gebruiken in een scriptresource
In dit voorbeeld worden parameters vanuit de scriptresource geopend door gebruik te maken van het using
bereik.
ConfigurationData- kan op een vergelijkbare manier worden geopend. Zoals voorbeeld 2 verwacht de implementatie dat een versie wordt opgeslagen in een lokaal bestand op het doelknooppunt. Zowel het lokale pad als de versie zijn configureerbaar en ontkoppelen code van configuratiegegevens.
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
}
}
}
}
Het resulterende MOF-bestand bevat de variabelen en de bijbehorende waarden die toegankelijk zijn via het using
bereik.
Ze worden geïnjecteerd in elk scriptblok, dat gebruikmaakt van de variabelen. Test- en setscripts worden verwijderd voor beknoptheid:
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 = ...;
};
Bekende beperkingen
- Referenties die binnen een scriptresource worden doorgegeven, zijn niet altijd betrouwbaar wanneer u een pull- of pushservermodel gebruikt. Gebruik in dit geval een volledige resource in plaats van een scriptresource.