使用 PowerShell DSC 來達到預期狀態

已完成

您可以使用 PowerShell DSC 來指定 VM 所需的狀態。 在此單元中,您將深入了解 PowerShell DSC,以及如何使用它來控制 VM 的狀態。 在範例案例中,您將會使用 PowerShell DSC 來確定所有網頁伺服器上都已安裝適用於 Windows Server 的 IIS,並以一致的方式進行設定。

此單元結束時,您將會:

  • 了解節點與設定區塊。
  • 了解認證資產。
  • 撰寫 PowerShell DSC 程式碼,以等冪方式安裝 Microsoft IIS。

DSC 資源

您已了解 PowerShell DSC 是宣告式的指令碼語言。 宣告式程式設計關注的是結果,而不是過程。 當您需要以一致的方式在一組 VM 上設定並部署 Azure 資源時,PowerShell DSC 可以提供協助。 即使您還不熟悉安裝及設定軟體與服務所需的技術步驟,還是可以使用 PowerShell DSC。

Windows Server 具有一組內建的 PowerShell DSC 資源。 您可以透過執行 Get-DSCResource PowerShell Cmdlet 來檢視這些資源。

Get-DscResource | select Name,Module,Properties

下表列出一些內建的 PowerShell DSC 資源。

資源 描述
檔案 管理節點上的檔案與資料夾
封存 以 .zip 格式解壓縮封存
環境 管理系統環境變數
記錄 在 DSC 事件記錄檔中寫入訊息
套件 安裝或移除套件
登錄 管理節點的登錄機碼 (HKEY Users 除外)
指令碼 在節點上執行 PowerShell 命令
服務 管理 Windows 服務
使用者 管理節點上的本機使用者
WindowsFeature 在節點上新增或移除角色或功能
WindowsOptionalFeature 在節點上新增或移除選擇性的角色或功能
WindowsProcess 管理 Windows 處理序

針對更複雜的資源 (例如 Active Directory 整合),請使用 DSC 資源套件 (每月更新)。 您可以在本課程模組結尾的「摘要」單元中找到 DSC 資源套件的連結。

您想要設定的資源必須已經是 VM 或部分 VM 映像的一部分。 否則,作業無法編譯並執行。

DSC 程式碼區塊的剖析

DSC 程式碼區塊包含四個區段。 使用下列範例以進一步了解。 在此範例中,數字不是語法的一部分。 它們被標記為註解,並參考下面討論中的各節。

Configuration MyDscConfiguration {              ##1
    Node "localhost" {                          ##2
        WindowsFeature MyFeatureInstance {      ##3
            Ensure = 'Present'
            Name = 'Web-Server'
        }
    }
}
MyDscConfiguration -OutputPath C:\temp\         ##4

設定語法包括下列各節:

  1. 設定:設定區塊是最外層的指令碼區塊。 它是以 Configuration 關鍵字開頭,而將由您提供名稱。 在這裡,設定的名稱是 MyDscConfiguration

    設定區塊會描述預期設定。 您可以將設定區塊視為函式,但它會包含要安裝的資源描述,而不是包含要安裝它們的程式碼。

    就像 PowerShell 函式一樣,設定區塊也可以接受參數。 例如,您可以將節點名稱參數化。

    Configuration MyDscConfiguration {
    param
    (
        [string] $ComputerName='localhost'
    )
    
    Node $ComputerName {
        ...
    }
    
  2. 節點:您可以有一或多個節點區塊。 當您編譯設定時,節點區塊會決定所產生的 .mof 檔案名稱。 例如,節點名稱 localhost 只會產生一個 localhost.mof 檔案,但您可以將該 .mof 檔傳送至任何伺服器。 當您使用多個節點名稱時,會產生多個 .mof 檔案。

    在節點區塊中使用陣列標記法,將目標設為多部主機。 例如:

    Node @('WEBSERVER1', 'WEBSERVER2', 'WEBSERVER3')
    
  3. 資源:您可以使用一或多個資源區塊來指定要設定的資源。 在此情況下,單一資源區塊會參考 WindowsFeature 資源。 WindowsFeature 資源可確保已安裝 Web-Server Windows 功能。

  4. MyDscConfiguration:此呼叫會叫用 MyDscConfiguration 區塊。 就像是執行函式一樣。 當您執行設定區塊時,它會編譯成受控物件格式 (MOF) 文件。 MOF 是由桌面管理任務推動小組 (DMTF) 所建立的已編譯語言,且它是以介面定義語言為基礎。

    針對 DSC 指令碼中列出的每個節點,會在您使用 -OutputPath 參數指定的資料夾中建立一個 .mof 檔案。

DSC 指令碼中的設定資料

在設定資料區塊中,您可以提供設定程序中可能需要的資料。 您可以將此資料套用至具名節點,或者將此資料在所有節點上全域套用。

設定資料區塊是包含節點陣列的具名區塊。 陣列必須命名為 AllNodes。 在 AllNodes 陣列中,您可以使用 NodeName 變數來指定節點的資料。

在先前的情節中,假設在每個節點上安裝的 Web 伺服器上,您想要將 SiteName 屬性設定為不同的值。 您可以定義設定資料區塊,如下所示:

$datablock =
@{
    AllNodes =
    @(
        @{
            NodeName = "WEBSERVER1"
            SiteName = "WEBSERVER1-Site"
        },
        @{
            NodeName = "WEBSERVER2"
            SiteName = "WEBSERVER2-Site"
        },
        @{
            NodeName = "WEBSERVER3"
            SiteName = "WEBSERVER3-Site"
        }
    );
}

如果您想要在每個節點中將屬性設定為相同的值,請在 AllNodes 陣列中指定 NodeName = "*"

保護 DSC 指令碼中的認證

DSC 指令碼可能需要設定程序的認證資訊。 避免將認證以純文字格式放在原始程式碼管理工具中。 相反地,Azure 自動化中的 DSC 設定可以參考儲存在 PSCredential 物件中的認證。 您可以使用 PSCredential 型別定義 DSC 指令碼的參數。 執行指令碼之前,請先取得使用者認證、使用這些認證建立新的 PSCredential 物件,然後將此物件作為參數傳遞至指令碼。

根據預設,認證在 .mof 檔不會加密,而是會以純文字形式公開。 若要加密認證,您必須在設定資料中使用憑證。 憑證的私密金鑰必須存在於您想要套用設定的節點上。 憑證是透過節點的 LCM 來設定的。

從 PowerShell 5.1 開始,節點上的 .mof 檔案會進行待用資料加密。 在傳輸過程中,所有認證都會透過 WinRM 進行加密。

將設定推送至節點

在您針對設定建立編譯的 .mof 檔案之後,您可以執行 Start-DscConfiguration Cmdlet 將它推送至節點。 如果您將路徑新增至目錄,它會將它在該目錄中找到的任何 .mof 檔案套用至節點:

Start-DscConfiguration -path D:\

此步驟會對應到您在上一單元中學到的「推送模式」

提取節點的設定

如果您在 Azure 上有數百個 VM,則使用提取模式比推送模式更合適。

您可以將 Azure 自動化帳戶設定作為提取服務;只要將設定上傳至自動化帳戶,然後使用此帳戶註冊您的 VM。

在編譯設定之前,請將 DSC 程序所需的任何 PowerShell 模組匯入到您的自動化帳戶中。 這些模組會定義如何完成工作,以達到預期狀態。

例如,上一個單元中的 DSC 指令碼使用 xSmbShare PowerShell 模組來指示 DSC 如何檢查檔案共用的狀態。 DSC 會自動將模組從自動化帳戶提取到節點。

下圖顯示如何設定 Azure 自動化狀態設定。 我們將在下一個單元中進一步探索這些步驟。

Diagram that shows the steps to set up DSC.

根據預設,在 15 分鐘後,VM 上的 LCM 會輪詢 Azure 自動化以尋找對 DSC 設定檔進行的任何變更。 VM 中的任何變更都會記錄在預期狀態設定中。 如果您變更設定,您可以將它上傳至自動化帳戶以自動重新設定 VM。

下圖顯示 LCM 在 VM 上管理預期狀態的程序。

Diagram that shows how the VM polls Azure Automation.

您的自動化帳戶會以原生方式處理認證。 此管理可降低保護和使用認證的複雜性。