Ресурс Script в DSC

Область применения: Windows PowerShell 4.0, Windows PowerShell 5.x

Ресурс Script в DSC Windows PowerShell предоставляет механизм запуска блоков сценариев на целевых узлах. Ресурс Script использует свойства GetScriptSetScript и 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] ]
}

Примечание

GetScriptTestScriptБлоки , и SetScript хранятся в виде строк.

Свойства

Свойство Описание
GetScript Блок скрипта, который возвращает текущее состояние узла.
SetScript Блок скрипта, который DSC использует для обеспечения соответствия, если узел не в нужном состоянии.
TestScript Блок скрипта, который определяет, находится ли узел в нужном состоянии.
Учетные данные Указывает учетные данные, используемые для запуска этого сценария, если они необходимы.

Общие свойства

Свойство Описание
DependsOn Указывает, что перед настройкой этого ресурса необходимо запустить настройку другого ресурса.
PsDscRunAsCredential Задает учетные данные для выполнения всего ресурса от другого имени.

Примечание

В WMF 5.0 было добавлено общее свойство PsDscRunAsCredential, разрешающее запуск любого ресурса DSC в контексте других учетных данных. Дополнительные сведения см. в разделе Использование учетных данных с ресурсами DSC.

Дополнительные сведения

GetScript

DSC не использует выходные данные командлета GetScriptGet-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 = ...;
};

Известные ограничения

  • Учетные данные, передаваемые в ресурсе скрипта, не всегда являются надежными при использовании модели опрашивающего или принудительного сервера. В этом случае используйте полный ресурс, а не ресурс скрипта.