Bagikan melalui


Sumber Daya Skrip DSC

Berlaku Untuk: Windows PowerShell 4.0, Windows PowerShell 5.x

Sumber daya Script di Windows PowerShell Desired State Configuration (DSC) menyediakan mekanisme untuk menjalankan blok skrip Windows PowerShell pada simpul target. Sumber daya Script menggunakan properti GetScriptSetScript, dan TestScript yang berisi blok skrip yang Anda tentukan untuk melakukan operasi status DSC yang sesuai.

Ujung

Jika memungkinkan, praktik terbaik adalah menggunakan sumber daya DSC yang ditentukan alih-alih yang satu ini. Sumber daya Script memiliki kelemahan yang membuatnya lebih sulit untuk menguji, memelihara, dan memprediksi.

Tidak seperti sumber daya DSC lainnya, setiap properti untuk sumber daya Script adalah properti kunci dan metode Dapatkan untuk sumber daya ini hanya dapat mengembalikan satu string untuk status saat ini. Tidak ada jaminan bahwa sumber daya ini diimplementasikan secara idempotensi atau akan berfungsi seperti yang diharapkan pada sistem apa pun karena menggunakan kode kustom. Ini tidak dapat diuji tanpa dipanggil pada sistem target.

Sebelum menggunakan sumber daya Script, pertimbangkan apakah Anda dapat menulis sumber daya sebagai gantinya. Menggunakan sumber daya DSC yang terdefinisi dengan baik membuat konfigurasi Anda lebih mudah dibaca dan dipertahankan.

Nota

Dokumentasi sumber daya DSC ini mencakup versi yang disertakan dengan PowerShell sebelum versi 7.2. Modul PSDscResources berisi Sumber Daya DSC baru dan yang diperbarui yang secara resmi didukung oleh Microsoft. Modul PSDscResources tersedia dari Galeri PowerShell.

Untuk informasi selengkapnya dan dokumentasi yang diperbarui, lihat dokumentasi referensi PSDscResources.

Sintaksis

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

Nota

GetScript TestScript, dan blok SetScript disimpan sebagai string.

Properti

Harta benda Deskripsi
GetScript Blok skrip yang mengembalikan status Simpul saat ini.
SetScript Blok skrip yang digunakan DSC untuk memberlakukan kepatuhan saat Node tidak dalam status yang diinginkan.
TestScript Blok skrip yang menentukan apakah Node berada dalam status yang diinginkan.
Credential Menunjukkan kredensial yang digunakan untuk menjalankan skrip ini, jika kredensial diperlukan.

Properti umum

Harta benda Deskripsi
DependsOn Menunjukkan bahwa konfigurasi sumber daya lain harus berjalan sebelum sumber daya ini dikonfigurasi.
PsDscRunAsCredential Mengatur kredensial untuk menjalankan seluruh sumber daya sebagai.

Nota

Properti umum PsDscRunAsCredential ditambahkan di WMF 5.0 untuk memungkinkan menjalankan sumber daya DSC apa pun dalam konteks info masuk lainnya. Untuk informasi selengkapnya, lihat Menggunakan Kredensial dengan Sumber Daya DSC.

Informasi tambahan

GetScript

DSC tidak menggunakan output dari cmdlet Get-DscConfiguration menjalankan untuk mengambil status simpul saat ini. Nilai pengembalian tidak diperlukan dari Jika Anda menentukan nilai pengembalian, nilai tersebut harus berupa hashtable yang berisi kunci Hasil yang nilainya adalah String.

TestScript

DSC menjalankan TestScript untuk menentukan apakah SetScript harus dijalankan. Jika TestScript mengembalikan $false, DSC menjalankan SetScript untuk membawa simpul kembali ke status yang diinginkan. Ini harus mengembalikan nilai boolean. Hasil $true menunjukkan bahwa simpul sesuai dan SetScript tidak boleh dijalankan.

Cmdlet Test-DscConfiguration menjalankan untuk mengambil kepatuhan simpul dengan sumber daya . Namun, dalam hal ini, SetScript tidak berjalan, tidak peduli apa TestScript pengembalian blok.

Nota

Semua output dari TestScript Anda adalah bagian dari nilai pengembaliannya. PowerShell menginterpretasikan output yang tidak tertekan sebagai bukan nol, yang berarti bahwa TestScript Anda mengembalikan $true terlepas dari status simpul Anda. Ini menghasilkan hasil yang tidak dapat diprediksi, positif palsu, dan menyebabkan kesulitan selama pemecahan masalah.

SetScript

SetScript memodifikasi simpul untuk memberlakukan status yang diinginkan. DSC memanggil SetScript jika blok skrip TestScript mengembalikan $false. SetScript seharusnya tidak memiliki nilai pengembalian.

Contoh

Contoh 1: Menulis teks sampel menggunakan sumber daya Skrip

Contoh ini menguji keberadaan C:\TempFolder\TestFile.txt pada setiap simpul. Jika tidak ada, itu membuatnya menggunakan SetScript. GetScript mengembalikan konten file, dan nilai pengembaliannya tidak digunakan.

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) } }
        }
    }
}

Contoh 2: Membandingkan informasi versi menggunakan sumber daya Skrip

Contoh ini mengambil informasi versi yang sesuai dari file teks di komputer penulisan dan menyimpannya dalam variabel . Saat menghasilkan file MOF simpul, DSC mengganti variabel $using:version di setiap blok skrip dengan nilai variabel $version. Selama eksekusi, versi yang sesuai disimpan dalam file teks pada setiap Simpul dan dibandingkan dan diperbarui pada eksekusi berikutnya.

$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')
            }
        }
    }
}

Contoh 3: Menggunakan parameter dalam sumber daya Skrip

Contoh ini mengakses parameter dari dalam sumber daya Skrip dengan menggunakan cakupan using. ConfigurationData dapat diakses dengan cara yang sama. Seperti contoh 2, implementasi mengharapkan versi disimpan di dalam file lokal pada simpul target. Jalur lokal dan versi dapat dikonfigurasi, memisahkan kode dari data konfigurasi.

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
            }
        }
    }
}

File MOF yang dihasilkan mencakup variabel dan nilainya yang diakses melalui cakupan using. Mereka disuntikkan ke dalam setiap blok skrip, yang menggunakan variabel. Uji dan Atur skrip dihapus untuk brevity:

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

Batasan yang Diketahui

  • Kredensial yang diteruskan dalam sumber daya skrip tidak selalu dapat diandalkan saat menggunakan model server penarikan atau pendorongan. Gunakan sumber daya lengkap daripada menggunakan sumber daya skrip dalam kasus ini.