다음을 통해 공유


DSC 스크립트 리소스

적용 대상: Windows PowerShell 4.0, Windows PowerShell 5.x

Windows PowerShell DSC(필요한 상태 구성)의 Script 리소스는 대상 노드에서 Windows PowerShell 스크립트 블록을 실행하는 메커니즘을 제공합니다. Script 리소스는 해당 DSC 상태 작업을 수행하기 위해 정의한 스크립트 블록이 포함된 GetScriptSetScriptTestScript 속성을 사용합니다.

가능한 경우 이 리소스 대신 정의된 DSC 리소스를 사용하는 것이 좋습니다. Script 리소스에는 테스트, 유지 관리 및 예측이 더 어렵게 만드는 단점이 있습니다.

다른 DSC 리소스와 달리 Script 리소스에 대한 모든 속성은 키 속성이며 이 리소스에 대한 Get 메서드는 현재 상태에 대한 단일 문자열만 반환할 수 있습니다. 이 리소스가 idempotently로 구현되거나 사용자 지정 코드를 사용하기 때문에 시스템에서 예상대로 작동한다는 보장은 없습니다. 대상 시스템에서 호출하지 않고는 테스트할 수 없습니다.

리소스를 사용하기 전에 리소스 작성할 있는지 여부를 고려합니다. 잘 정의된 DSC 리소스를 사용하면 구성을 더 읽기 하며 유지 관리할 수 있습니다.

메모

이 DSC 리소스에 대한 이 설명서에서는 버전 7.2 이전의 PowerShell에 포함된 버전을 다룹니다. PSDscResources 모듈에는 Microsoft에서 공식적으로 지원하는 새 DSC 리소스와 업데이트된 DSC 리소스가 포함되어 있습니다. PSDscResources 모듈은 PowerShell 갤러리에서 사용할 수 있습니다.

자세한 내용 및 업데이트된 설명서는 PSDscResources 참조 설명서참조하세요.

통사론

Script [string] #ResourceName
{
    GetScript = [string]
    SetScript = [string]
    TestScript = [string]
    [ Credential = [PSCredential] ]
    [ DependsOn = [string[]] ]
    [ PsDscRunAsCredential = [PSCredential] ]
}

메모

GetScript TestScriptSetScript 블록은 문자열로 저장됩니다.

속성

재산 묘사
GetScript 노드의 현재 상태를 반환하는 스크립트 블록입니다.
SetScript 노드가 원하는 상태가 아닐 때 DSC에서 규정 준수를 적용하는 데 사용하는 스크립트 블록입니다.
TestScript 노드가 원하는 상태인지 여부를 결정하는 스크립트 블록입니다.
자격 증명 자격 증명이 필요한 경우 이 스크립트를 실행하는 데 사용할 자격 증명을 나타냅니다.

공통 속성

재산 묘사
DependsOn 이 리소스를 구성하기 전에 다른 리소스의 구성을 실행해야 임을 나타냅니다.
PsDscRunAsCredential 전체 리소스를 실행하기 위한 자격 증명을 로 설정합니다.

메모

다른 자격 증명의 컨텍스트에서 모든 DSC 리소스를 실행할 수 있도록 PsDscRunAsCredential 공용 속성이 WMF 5.0에 추가되었습니다. 자세한 내용은 DSC 리소스자격 증명 사용 참조하세요.

추가 정보

GetScript

DSC는 GetScript 출력을 사용하지 않습니다. Get-DscConfiguration cmdlet은 GetScript 실행하여 노드의 현재 상태를 검색합니다. 반환 값은 GetScript 필요하지 않습니다. 반환 값을 지정하는 경우 값이 String인 Result 키가 포함된 해시 테이블이어야 합니다.

TestScript

DSC는 TestScript 실행하여 SetScript 실행해야 하는지 여부를 확인합니다. TestScript $false반환하는 경우 DSC는 SetScript 실행하여 노드를 다시 원하는 상태로 만듭니다. 부울 값을 반환해야 합니다. $true 결과는 노드가 규정을 준수하고 SetScript 실행해서는 안 되었음을 나타냅니다.

Test-DscConfiguration cmdlet은 TestScript 실행하여 Script 리소스를 준수하는 노드를 검색합니다. 그러나 이 경우 SetScriptTestScript 블록이 반환되더라도 실행되지 않습니다.

메모

TestScript 모든 출력은 반환 값의 일부입니다. PowerShell은 지원되지 않는 출력을 0이 아닌 출력으로 해석합니다. 즉, 노드 상태에 관계없이 TestScript$true 반환합니다. 이로 인해 예기치 않은 결과, 가양성 및 문제 해결 중에 어려움이 발생합니다.

SetScript

SetScript 노드를 수정하여 원하는 상태를 적용합니다. DSC는 TestScript 스크립트 블록이 $false반환하는 경우 SetScript 호출합니다. 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: 스크립트 리소스를 사용하여 버전 정보 비교

이 예제에서는 작성 컴퓨터의 텍스트 파일에서 규격 버전 정보를 검색하고 $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: 스크립트 리소스에서 매개 변수 사용

이 예제에서는 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에 삽입됩니다. 간단히 하기 위해 테스트 및 설정 스크립트가 제거됩니다.

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 = ...;
};

알려진 제한 사항

  • 끌어오기 또는 푸시 서버 모델을 사용하는 경우 스크립트 리소스 내에서 전달되는 자격 증명이 항상 신뢰할 수 있는 것은 아닙니다. 이 경우 스크립트 리소스를 사용하는 대신 전체 리소스를 사용합니다.