Ресурс скрипта DSC
Область применения: Windows PowerShell 4.0, Windows PowerShell 5.x
Ресурс Script
в Windows PowerShell Desired State Configuration (DSC) предоставляет механизм запуска блоков скриптов Windows PowerShell на целевых узлах. Ресурс Script
использует GetScript
SetScript
и TestScript
свойства, содержащие блоки скриптов, которые определяются для выполнения соответствующих операций состояния DSC.
Кончик
По возможности рекомендуется использовать определенный ресурс DSC вместо этого. Ресурс Script
имеет недостатки, которые упрощают тестирование, обслуживание и прогнозирование.
В отличие от других ресурсов DSC, каждое свойство для ресурса Script
является ключевым свойством , а метод get get для этого ресурса может возвращать только одну строку для текущего состояния. Нет никаких гарантий, что этот ресурс реализован идемпотентно или что он будет работать должным образом в любой системе, так как он использует пользовательский код. Его нельзя протестировать, не вызывая в целевой системе.
Прежде чем использовать ресурс Script
, рассмотрите, можно ли вместо этого создать ресурс.
Использование хорошо определенных ресурсов DSC делает конфигурации более читаемыми и обслуживаемыми.
Заметка
Эта документация по этому ресурсу DSC охватывает версию, включенную в PowerShell до версии 7.2. Модуль PSDscResources
Дополнительные сведения и обновленную документацию см. в справочной документации PSDscResources.
Синтаксис
Script [string] #ResourceName
{
GetScript = [string]
SetScript = [string]
TestScript = [string]
[ Credential = [PSCredential] ]
[ DependsOn = [string[]] ]
[ PsDscRunAsCredential = [PSCredential] ]
}
Заметка
GetScript
TestScript
и блоки SetScript
хранятся в виде строк.
Свойства
Свойство | Описание |
---|---|
GetScript | Блок скрипта, возвращающий текущее состояние узла. |
SetScript | Блок скрипта, который DSC использует для обеспечения соответствия требованиям, если узел не имеет требуемого состояния. |
TestScript | Блок скрипта, определяющий, находится ли узел в требуемом состоянии. |
Мандат | Указывает учетные данные, используемые для выполнения этого скрипта, если необходимы учетные данные. |
Общие свойства
Свойство | Описание |
---|---|
DependsOn | Указывает, что конфигурация другого ресурса должна выполняться перед настройкой этого ресурса. |
PsDscRunAsCredential | Задает учетные данные для запуска всего ресурса как. |
Заметка
PsDscRunAsCredential общее свойство было добавлено в WMF 5.0, чтобы разрешить запуск любого ресурса DSC в контексте других учетных данных. Дополнительные сведения см. в разделе Использование учетных данных сресурсов DSC.
Дополнительные сведения
GetScript
DSC не использует выходные данные из GetScript
командлет Get-DscConfiguration выполняет GetScript
для получения текущего состояния узла. Возвращаемое значение не требуется из GetScript
Если вы указываете возвращаемое значение, оно должно быть хэш-файлом, содержащим ключ result, значение которого является строкой.
TestScript
DSC выполняет TestScript
, чтобы определить, следует ли выполнять SetScript
. Если TestScript
возвращает $false
, DSC выполняет SetScript
, чтобы вернуть узел в нужное состояние. Он должен возвращать логическое значение. Результат $true
указывает, что узел соответствует требованиям и SetScript
не должен выполняться.
Командлет Test-DscConfiguration выполняет TestScript
для получения узлов соответствия Script
ресурсам. Однако в этом случае SetScript
не выполняется, независимо от того, какой TestScript
блок возвращается.
Заметка
Все выходные данные из TestScript
являются частью возвращаемого значения. PowerShell интерпретирует неподпечатанные выходные данные как ненулевые, что означает, что TestScript
возвращает $true
независимо от состояния узла. Это приводит к непредсказуемым результатам, ложным срабатываниям и вызывает трудности во время устранения неполадок.
SetScript
SetScript
изменяет узел для обеспечения требуемого состояния. DSC вызывает SetScript
, если блок скрипта TestScript
возвращает $false
. У SetScript
не должно быть возвращаемого значения.
Примеры
Пример 1. Написание примера текста с помощью ресурса скрипта
В этом примере проверяется наличие C:\TempFolder\TestFile.txt
на каждом узле. Если он не существует, он создает его с помощью SetScript
.
GetScript
возвращает содержимое файла, а его возвращаемое значение не используется.
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) } }
}
}
}
Пример 2. Сравнение сведений о версии с помощью ресурса скрипта
В этом примере извлекаются сведения о версии $using:version
в каждом блоке скрипта значением переменной $version
. Во время выполнения соответствующая версия хранится в текстовом файле на каждом узле и сравнивается и обновляется при последующих выполнении.
$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')
}
}
}
}
Пример 3. Использование параметров в ресурсе скрипта
Этот пример обращается к параметрам из ресурса скрипта, используя область using
.
ConfigurationData можно получить аналогичным образом. Как и в примере 2, реализация ожидает, что версия будет сохранена в локальном файле на целевом узле. Локальный путь и версия настраиваются, развязывая код от данных конфигурации.
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
}
}
}
}
Полученный MOF-файл содержит переменные и их значения, доступ к ним через область using
.
Они внедряются в каждый блок скрипта, который использует переменные. Скрипты тестирования и задания удаляются для краткости:
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 = ...;
};
Известные ограничения
- Учетные данные, передаваемые в ресурсе скрипта, не всегда являются надежными при использовании модели вытягивания или отправки сервера. Используйте полный ресурс, а не используйте ресурс скрипта в этом случае.