Поделиться через


Ресурс скрипта DSC

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

Ресурс Script в Windows PowerShell Desired State Configuration (DSC) предоставляет механизм запуска блоков скриптов Windows PowerShell на целевых узлах. Ресурс Script использует GetScriptSetScriptи TestScript свойства, содержащие блоки скриптов, которые определяются для выполнения соответствующих операций состояния DSC.

Кончик

По возможности рекомендуется использовать определенный ресурс DSC вместо этого. Ресурс Script имеет недостатки, которые упрощают тестирование, обслуживание и прогнозирование.

В отличие от других ресурсов DSC, каждое свойство для ресурса Script является ключевым свойством , а метод get 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 Задает учетные данные для запуска всего ресурса как.

Заметка

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. Сравнение сведений о версии с помощью ресурса скрипта

В этом примере извлекаются сведения о версии из текстового файла на компьютере разработки и хранятся в переменной . При создании 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. Использование параметров в ресурсе скрипта

Этот пример обращается к параметрам из ресурса скрипта, используя область 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 = ...;
};

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

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