Ресурс Script в DSC
Область применения: Windows PowerShell 4.0, Windows PowerShell 5.x
Ресурс Script
в DSC Windows PowerShell предоставляет механизм запуска блоков сценариев на целевых узлах. Ресурс Script
использует свойства GetScript
SetScript
и TestScript
, которые содержат блоки скрипта, определяемые вами для выполнения соответствующих операций DSC.
Совет
По возможности рекомендуется использовать определенный ресурс DSC вместо этого. У Script
ресурса есть недостатки, которые усложняют тестирование, обслуживание и прогнозирование.
В отличие от других ресурсов DSC, каждое Script
свойство ресурса является ключевым свойством, и метод Get для этого ресурса может возвращать только одну строку для текущего состояния. Нет никаких гарантий того, что этот ресурс реализован идемпотентно или что он будет работать должным образом в любой системе, так как он использует пользовательский код. Его нельзя проверить без вызова в целевой системе.
Перед использованием Script
ресурса подумайте, можно ли вместо этого создать ресурс .
Использование четко определенных ресурсов DSC делает конфигурации более удобочитаемыми и поддерживаемыми.
Примечание
В этой документации по этому ресурсу DSC рассматривается версия, которая входит в состав PowerShell до версии 7.2. Модуль PSDscResources содержит новые и обновленные ресурсы DSC, которые официально поддерживаются корпорацией Майкрософт. Модуль PSDscResources доступен из коллекции PowerShell.
Дополнительные сведения и обновленную документацию см. в справочной документации по 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 | Задает учетные данные для выполнения всего ресурса от другого имени. |
Примечание
В WMF 5.0 было добавлено общее свойство PsDscRunAsCredential, разрешающее запуск любого ресурса DSC в контексте других учетных данных. Дополнительные сведения см. в разделе Использование учетных данных с ресурсами DSC.
Дополнительные сведения
GetScript
DSC не использует выходные данные командлета GetScript
Get-DscConfiguration , выполняемого GetScript
для получения текущего состояния узла. Возвращаемое значение не требуется из GetScript
. Если вы укажете возвращаемое значение, оно должно быть хэш-списком, содержащим ключ Result , значением которого является String.
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: написание примера текста с помощью ресурса Script
Этот пример проверяет наличие 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. Сравнение сведений о версии с помощью ресурса Script
В этом примере из текстового файла на исходном компьютере извлекаются сведения о соответствующей версии, которые сохраняются в переменной $version
. При создании MOF-файла узла DSC заменяет переменные $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. Использование параметров в ресурсе Script
В этом примере осуществляется доступ к параметрам из ресурса Script с использованием области 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
.
Они внедряются в каждый scriptblock, в котором используются переменные. Скрипты test и Set удалены для краткости:
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 = ...;
};
Известные ограничения
- Учетные данные, передаваемые в ресурсе скрипта, не всегда являются надежными при использовании модели опрашивающего или принудительного сервера. В этом случае используйте полный ресурс, а не ресурс скрипта.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по