命令型 DSC 資源的結構
DSC 資源提供標準化介面來管理系統的設定。 資源會定義您可以管理的屬性,並實作取得資源實例所需的程序代碼。
以命令為基礎的 DSC 資源會以至少兩個檔案定義:
- DSC 資源指令清單,告知 DSC 如何與資源互動。
- 一或多個可執行檔及其相依性來管理資源的實例。
DSC 資源指令清單
DSC 資源指令清單會定義為 JSON 檔案。 若要讓 DSC 將 JSON 檔案辨識為指令清單,檔案必須符合下列準則:
- 檔案必須可在環境變數中
PATH
探索。 - 檔案名的結尾
.dsc.resource.json
必須是 。
當 DSC 搜尋本機系統是否有可用的命令型 DSC 資源時,它會在 中 PATH
搜尋使用 DSC 資源指令清單命名慣例之檔案的每個資料夾。 DSC 接著會剖析每個探索到的檔案,並針對 DSC 資源指令清單 JSON 架構加以驗證。
如果 JSON 檔案根據架構進行驗證,DSC 可以使用 DSC 資源。
指令清單至少必須定義:
- 其相容的 DSC 資源指令清單 JSON 架構版本。
- 資源的完整名稱,例如
Microsoft.Windows/Registry
。 完整名稱語法為<owner>[.<group>][.<area>]/<name>
。 完整名稱的群組和區域元件可讓您將資源組織成命名空間。 - DSC 如何呼叫 命令,以取得資源實例的目前狀態。
- 驗證實例的方法。 這可以是下列項目之一:
- 描述實例的 JSON 架構
- DSC 必須呼叫 命令,才能在運行時間取得架構
- 用來驗證巢狀 DSC 資源的命令。 最後一個選項僅適用於 DSC 群組資源和 DSC 提供者資源。
指令清單可以選擇性地定義:
- DSC 如何呼叫 命令,以測試實例是否處於所需狀態。
- DSC 如何呼叫 命令,將實例設定為所需的狀態。
- 命令所傳回的非零結束代碼意義。
- 當資源是 DSC 群組資源或 DSC 提供者資源時,DSC 如何呼叫 命令來管理其他 DSC 資源。
- 關於資源的元數據,例如其作者和簡短描述。
如果指令清單未定義如何測試資源的實例,DSC 會針對資源實例執行綜合測試。 DSC 的綜合測試一律會取得實例的實際狀態,並且對實例屬性與所需狀態進行嚴格區分大小寫的比較。 綜合測試會忽略前面加上底線 () _
或貨幣符號 $
() 的任何屬性。 如果任何屬性與定義的所需狀態不完全相同,DSC 會將實例回報為不符合規範。
如果指令清單未定義如何設定 DSC 資源的實例,DSC 就無法使用資源來強制執行所需的狀態。
指令清單不需要為每個作業指定相同的可執行檔。 每個作業的定義都是獨立的。
DSC 資源可執行檔
以命令為基礎的 DSC 資源一律需要可執行檔,才能執行 DSC。 DSC 資源指令清單不需要與可執行文件組合。 可執行檔可以是任何可執行檔,例如二進位應用程式或殼層腳本。 資源可能會針對不同的作業使用不同的可執行檔。
若要讓 DSC 使用可執行文件,必須在環境變數中 PATH
加以探索。 DSC 會針對每個作業呼叫可執行檔一次,並使用可執行檔傳回的結束代碼來判斷命令是否成功。 DSC 會將結束代碼 0
視為成功,並將所有其他結束代碼視為錯誤。
輸入
DSC 會將輸入傳送至命令型 DSC 資源,做為 stdin 上的 JSON 數據 Blob,或做為一組自變數旗標和值。 輸入處理是在 DSC 資源指令清單中為每個作業定義。
當 DSC 透過 stdin 以 JSON 形式傳送輸入時,數據 Blob 是實例所需狀態的 JSON 表示法。 這是資源最健全的選項,因為它可讓資源支援具有巢狀物件的複雜屬性。
當 DSC 將輸入當做自變數傳送時,它會為每個指定的屬性產生一對自變數。 第一個自變數是前面加上 --
的屬性名稱,例如 --duration
。 第二個自變數是 屬性的值。 不保證自變數組的順序。 這個輸入法不支援複雜的屬性。
輸出
命令型 DSC 資源的可執行文件必須在 DSC 呼叫時,將 JSON 數據傳回 stdout。 輸出編碼必須是UTF-8。 當資源傳回實例的狀態時,DSC 會根據資源的實例架構來驗證 JSON 數據。
針對 DSC 提供者資源,DSC 預期可執行檔會傳遞其管理為單一 JSON 陣列或一系列 JSON 行之資源的實例狀態。
以命令為基礎的 DSC 資源可以將記錄資訊發出至 stderr,以向 DSC 報告記錄資訊。 每個記錄項目都必須是包含兩個索引鍵的 JSON 物件:
- 索引
message
鍵會定義記錄項目的人類可讀取字串。 - 索引
level
鍵會定義訊息是否代表Error
、、Warning
或Information
。
DSC 會從資源收集訊息,並在組態作業的結果中顯示訊息。 DSC 直接在設定外部叫用資源時,不會收集訊息。 相反地,它們只會發出至 stderr。