Share via


如何建立自訂電腦設定原則定義

開始之前,建議您先閱讀機器設定的概觀頁面,以及機器設定補救選項的詳細資料。

重要

Azure 虛擬機器需要機器設定延伸模組。 如果要在所有機器間大規模部署擴充功能,請指派下列原則方案:Deploy prerequisites to enable machine configuration policies on virtual machines

若要使用套用設定的機器設定套件,則 Azure VM 客體設定延伸模組 1.26.24 版或更新版本,或 Arc 代理程式 1.10.0 或更新版本,為必要項。

使用 AuditIfNotExistsDeployIfNotExists 的自訂機器設定原則定義處於正式發行 (GA) 支援狀態。

使用下列步驟來建立您自己的原則,以稽核合規性或管理已啟用 Azure 或 Arc 的機器狀態。

安裝 PowerShell 7 和必要的 PowerShell 模組

首先,設定機器設定製作環境,為您的作業系統和 GuestConfiguration 模組安裝必要的 PowerShell 版本。

建立並發佈機器設定套件成品

如果您尚未這麼做,請遵循如何建立自訂機器設定套件成品中的步驟,建立和發佈自訂機器設定套件。 然後遵循如何測試機器設定套件成品中的步驟,在開發環境中驗證套件。

注意

本文中的範例程式碼會參考 $contentUri 變數。 如果您使用與先前教學課程相同的 PowerShell 工作階段來建立及測試套件成品,該變數可能已經有套件的 URI。

如果您的 PowerShell 工作階段中未將 $contentUri 變數設定為套件的 URI,則必須加以設定。 此範例會使用儲存體帳戶的連接字串New-AzStorageContext Cmdlet 來建立儲存體內容。 然後,這會取得已發行套件的儲存體 Blob,並使用該物件的屬性來取得內容 URI。

$connectionString = '<storage-account-connection-string>'
$context = New-AzStorageContext -ConnectionString $connectionString
$getParams = @{
    Context   = $context
    Container = '<container-name>'
    Blob      = '<published-package-file-name>'
}
$blob = Get-AzStorageBlob @getParams
$contentUri = $blob.ICloudBlob.Uri.AbsoluteUri

機器設定的原則需求

原則定義 metadata 區段必須包含來賓設定服務的兩個屬性,才能自動佈建和報告機器設定指派。 category 屬性必須設定為 Guest Configuration,且命名為 guestConfiguration 的區段必須包含機器設定指派的相關資訊。 該New-GuestConfigurationPolicyCmdlet 會自動建立此文字。

下列範例示範由 New-GuestConfigurationPolicy 自動建立的 metadata 區段。

"metadata": {
    "category": "Guest Configuration",
    "guestConfiguration": {
        "name": "test",
        "version": "1.0.0",
        "contentType": "Custom",
        "contentUri": "CUSTOM-URI-HERE",
        "contentHash": "CUSTOM-HASH-VALUE-HERE",
        "configurationParameter": {}
    }
}

如果定義效果設定為 DeployIfNotExists,則 then 區段必須包含機器設定指派的相關部署詳細資料。 該New-GuestConfigurationPolicyCmdlet 會自動建立此文字。

建立 Azure 原則定義

在完成建立並上傳機器設定自訂原則套件後,請建立機器設定原則定義。 New-GuestConfigurationPolicy Cmdlet 會採納自訂原則套件,並建立原則定義。

PolicyId 參數的New-GuestConfigurationPolicy需要唯一字串。 必須使用全域唯一識別碼 (GUID)。 針對新定義,請使用 New-GUID Cmdlet 來產生新的 GUID。 對定義進行更新時,請針對 PolicyId 使用相同的唯一字串,以確保正確定義已更新。

New-GuestConfigurationPolicy Cmdlet 的參數:

  • PolicyId:GUID。
  • ContentUri:機器設定內容套件的公用 HTTP(s) URI。
  • DisplayName:原則顯示名稱。
  • Description:原則描述。
  • Parameter:雜湊表中提供的原則參數。
  • PolicyVersion:原則版本。
  • Path:建立原則定義的目的地路徑。
  • 平台:機器設定原則和內容套件的目標平台 (Windows/Linux)。
  • Mode:(區分大小寫:ApplyAndMonitorApplyAndAutoCorrectAudit) 選擇原則是否應該稽核或部署設定。 預設值為 Audit
  • Tag 會將一或多個標籤篩選新增至原則定義
  • Category 會在原則定義中,設定類別中繼資料欄位

如需有關 Mode 參數的詳細資訊,請參閱如何設定機器設定的補救選項頁面。

在指定的路徑中建立原則定義,藉以使用自訂群組態套件進行稽核:

$PolicyConfig      = @{
  PolicyId      = '_My GUID_'
  ContentUri    = $contentUri
  DisplayName   = 'My audit policy'
  Description   = 'My audit policy'
  Path          = './policies/auditIfNotExists.json'
  Platform      = 'Windows'
  PolicyVersion = 1.0.0
}

New-GuestConfigurationPolicy @PolicyConfig

在指定的路徑中建立原則定義,藉以使用自訂群組態套件進行部署:

$PolicyConfig2      = @{
  PolicyId      = '_My GUID_'
  ContentUri    = $contentUri
  DisplayName   = 'My deployment policy'
  Description   = 'My deployment policy'
  Path          = './policies/deployIfNotExists.json'
  Platform      = 'Windows'
  PolicyVersion = 1.0.0
  Mode          = 'ApplyAndAutoCorrect'
}

New-GuestConfigurationPolicy @PolicyConfig2

該 Cmdlet 輸出會傳回物件,其中包含原則檔案的方案顯示名稱和路徑。 建立稽核原則定義的定義 JSON 檔案名稱為 auditIfNotExists.json,以及建立原則定義來套用設定的檔案名稱為 deployIfNotExists.json

使用標籤來篩選機器設定原則

GuestConfiguration 模組中,由 Cmdlet 所建立的原則定義可選擇性地包含標籤篩選。 New-GuestConfigurationPolicyTag 參數支援包含個別標籤項目的雜湊表陣列。 標籤會新增至原則定義的if 區段,且無法由原則指派加以修改。

以下提供篩選標籤的原則定義範例程式碼片段。

"if": {
  "allOf" : [
    {
      "allOf": [
        {
          "field": "tags.Owner",
          "equals": "BusinessUnit"
        },
        {
          "field": "tags.Role",
          "equals": "Web"
        }
      ]
    },
    {
      // Original machine configuration content
    }
  ]
}

在自訂機器設定原則定義中使用參數

機器設定支援在執行階段覆寫 DSC 設定的屬性。 這項功能表示套件中 MOF 檔案的值不一定要被視為靜態。 覆寫值透過 Azure 原則來提供,且不會影響撰寫或編譯 DSC 設定的方式。

機器設定支援參數的下列實值型別:

  • String
  • 布林值
  • Double
  • Float

CmdletNew-GuestConfigurationPolicyGet-GuestConfigurationPackageComplianceStatus包含名為 Parameters 的參數。 此參數會採納雜湊表定義,包括每個參數的所有詳細資料,並為每個檔案建立必要區段,以用於 Azure 原則定義。

下列範例會建立原則定義來稽核服務,使用者可在原則指派時從清單中進行選取。

# This DSC resource definition...
Service 'UserSelectedNameExample' {
    Name   = 'ParameterValue'
    Ensure = 'Present'
    State  = 'Running'
}

# ...can be converted to a hash table:
$PolicyParameterInfo     = @(
  @{
    # Policy parameter name (mandatory)
    Name                 = 'ServiceName'
    # Policy parameter display name (mandatory)
    DisplayName          = 'windows service name.'
    # Policy parameter description (optional)
    Description          = 'Name of the windows service to be audited.'
    # DSC configuration resource type (mandatory)
    ResourceType         = 'Service'
    # DSC configuration resource id (mandatory)
    ResourceId           = 'UserSelectedNameExample'
    # DSC configuration resource property name (mandatory)
    ResourcePropertyName = 'Name'
    # Policy parameter default value (optional)
    DefaultValue         = 'winrm'
    # Policy parameter allowed values (optional)
    AllowedValues        = @('BDESVC','TermService','wuauserv','winrm')
  })

# ...and then passed into the `New-GuestConfigurationPolicy` cmdlet
$PolicyParam = @{
  PolicyId      = 'My GUID'
  ContentUri    = $contentUri
  DisplayName   = 'Audit Windows Service.'
  Description   = "Audit if a Windows Service isn't enabled on Windows machine."
  Path          = '.\policies\auditIfNotExists.json'
  Parameter     = $PolicyParameterInfo
  PolicyVersion = 1.0.0
}

New-GuestConfigurationPolicy @PolicyParam

發佈 Azure 原則定義

最後,您可以使用 New-AzPolicyDefinition Cmdlet 來發佈原則定義。 下列命令會將機器設定原則發佈至原則中心。

如果要執行 New-AzPolicyDefinition 命令,則需要在 Azure 中建立原則定義的存取權。 如需特定的授權需求,請參閱 Azure 原則概觀頁面。 建議的內建角色為 Resource Policy Contributor

New-AzPolicyDefinition -Name 'mypolicydefinition' -Policy '.\policies\auditIfNotExists.json'

或者,如果原則是「在不存在時部署」原則 (DINE),則使用此命令:

New-AzPolicyDefinition -Name 'mypolicydefinition' -Policy '.\policies\deployIfNotExists.json'

在 Azure 中建立原則之後,即可指派定義作為最後一步驟。 請參閱使用入口網站Azure CLI 以及 Azure PowerShell 來指派定義的方法。

原則生命週期

如果您想要釋放原則定義的更新,請針對來賓設定套件和Azure 原則定義詳細資料來進行變更。

注意

機器設定所指派的version屬性只會影響 Microsoft 所裝載的套件。 版本設定自訂內容的最佳做法是在檔案名稱中包含該版本。

首先,在執行 New-GuestConfigurationPackage 時,請指定套件名稱,使其不同於舊版。 您可以在名稱中包含版本號碼,例如PackageName_1.0.0。 此範例中的數位只用來讓套件成為唯一,而非指定套件應該視為較新或較舊套件。

其次,請依照下列每項說明來更新 CmdletNew-GuestConfigurationPolicy所使用的參數。

  • Version:執行 New-GuestConfigurationPolicy Cmdlet 時,您必須指定大於目前發佈的版本號碼。
  • contentUri:當您執行New-GuestConfigurationPolicyCmdlet 時,您必須指定封裝位置的 URI。 在檔案名稱中包含套件版本,可確保每個版本中此屬性的值都會變更。
  • contentHashNew-GuestConfigurationPolicy Cmdlet 會自動更新此屬性。 此為 New-GuestConfigurationPackage 所建立套件的雜湊值。 針對您發佈的 .zip 檔案而言,此屬性必須是正確的。 如果只更新 contentUri 屬性,則延伸模組會拒絕內容套件。

發行更新套件的最簡單方式就是重複本文中所述程序,並指定更新的版本號碼。 此程序可確保所有屬性都已正確更新。

下一步