使用 what-if 來預測部署狀況

已完成

在環境中部署或修改資源的任何人,心中都會有如下的問題:

  • 是否會破壞某些內容?
  • 我需要刪除任何項目嗎?
  • 這次部署會如何影響現有的資源?
  • 按下部署按鈕之前,我可以驗證部署後實際狀況是否與預期狀況相同嗎?

直接部署且祈禱萬事順利並不是理想的辦法。 較佳的作法是使用 what-if 作業。 此作業有助於預測新部署帶來的結果。

Azure Resource Manager 提供 what-if 作業,以在部署範本時,醒目提示所作的變更。 what-if 作業不會對現有的資源進行任何變更。 相反地,該作業可預測在資源群組與訂用帳戶層級部署指定範本時所發生的變更。

注意

假設狀況作業有時會顯示某資源將會變更,但實際則否。 我們正努力減少這些問題,但我們需要您的協助。 請回報這些問題

使用假設狀況作業會將目前的狀態模型雨需要的狀態模型互相比較。 what-if 作業會確認範本所做的變更是否符合預期,而不會將這些變更套用到實際資源,或套用到這些資源的狀態。

控制假設狀況結果的格式

New-AzResourceGroupDeployment Azure PowerShell Cmdlet 會在資源群組中建立新的部署。 當您在此命令中新增 -Whatif 參數時,其會從執行部署,切換為只回報執行時狀況的「預覽」

az deployment group what-if 命令可讓您預覽在執行部署時狀況。

您可以使用下列其中一個結果格式,控制假設狀況作業的文字輸出量:

  • FullResourcePayloads. 透過包含此參數,您會取得「詳細資訊」 輸出,其中包含將會變更的資源清單。 輸出也會顯示將根據範本變更之所有屬性的詳細資料。
  • ResourceIdOnly. 此模式會回將變更的資源清單,而不會傳回所有詳細資料。

例如,假設您要在部署單一儲存體帳戶至現有環境的範本中變更儲存體類型。

您可以執行下列 PowerShell 程式碼,並要求 Resource Manager 提供您完整的資源承載:

New-AzResourceGroupDeployment `
  -ResourceGroupName ToyStorage `
  -TemplateFile $templateFileName `
  -WhatIf `
  -WhatIfResultFormat FullResourcePayloads
az deployment group what-if \
  --resource-group ToyStorage \
  --template-file $templateFile \
  --result-format FullResourcePayloads

上述命令會產生下列結果:

Resource and property changes are indicated with this symbol:
  ~ Modify

The deployment will update the following scope:

Scope: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/ToyStorage

  ~ Microsoft.Storage/storageAccounts/bz64gjjpidbuvi [2019-06-01]
    ~ sku.name: "Standard_LRS" => "Standard_GRS"

Resource changes: 1 to modify.

您之後可以重新執行此命令,而且可以只要求資源識別碼:

New-AzResourceGroupDeployment `
  -ResourceGroupName ToyStorage `
  -TemplateFile $templateFileName `
  -WhatIf `
  -WhatIfResultFormat ResourceIdOnly
az deployment group what-if \
  --resource-group ToyStorage \
  --template-file $templateFile \
  --result-format ResourceIdOnly

上述命令會產生下列結果:

Resource and property changes are indicated with this symbol:
  ! Deploy

The deployment will update the following scope:

Scope: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/ToyStorage

  ! Microsoft.Storage/storageAccounts/bz64gjjpidbuvi

Resource changes: 1 to deploy.

假設狀況偵測到的變更類型

當您使用 what-if 作業時,其會列出六種類型的變更:

類型 說明 影響
建立 資源目前不存在,但已在範本中定義。 將會建立資源。
刪除 此變更類型僅適用於使用完整模式進行部署的情況。 資源存在,但未在範本中定義。 若您使用增量模式進行部署,不會刪除資源。 若您使用完整模式進行部署,不會刪除資源。 只有透過完整模式支援刪除的資源,才會傳回此變更類型。
忽略 資源存在,但未在範本中定義。 當您使用增量模式 (這是預設部署模式) 時,不會部署或修改資源。 若您使用完整模式進行部署,將會刪除資源。
NoChange 資源存在,且已在範本中定義。 資源將會重新部署,但資源的屬性不會變更。 當結果格式設定為 FullResourcePayloads (預設的結果格式) 時,會傳回此變更類型。
Modify 資源存在,且已在範本中定義。 資源將會重新部署,且資源的屬性將會變更。 當結果格式設定為 FullResourcePayloads (預設的結果格式) 時,會傳回此變更類型。
部署 資源存在,且已在範本中定義。 將會重新部署資源。 資源的屬性不一定會變更。 當作業沒有足夠資訊可判斷是否有任何屬性變更時,作業會傳回此變更類型。 僅當結果格式設定為 ResourceIdOnly 時,才會出現此情況。

若您不需要知道所有變更類型,可以使用 -WhatIfExcludeChangeType 引數,省略您無須關注的類型。

若您不需要知道所有變更類型,可以使用 --what-if-exclude-change-types 引數,省略您無須關注的類型。

在指令碼中使用假設狀況的結果

您可能會在指令碼中,或在自動部署流程中,使用假設狀況作業的輸出。

您可以使用 Get-AzResourceGroupDeploymentWhatIfResult Cmdlet 取得結果。 您的指令碼可以剖析所得結果,以及執行您可能需要的任何自訂邏輯。

您可以將 --no-pretty-print 引數附加至 CLI 命令,以取得原始 JSON 結果。 您的指令碼可以剖析所得結果,以及執行您可能需要的任何自訂邏輯。

部署模式與刪除資源

當您部署範本時,有時候可能會想要確認資源的刪除。 假設狀況作業可就此目的,為您使用的部署模式提出說明。 若使用完整部署模式,Resource Manager 會回報因部署中未定義而要刪除的資源。

下列範本範例更新現有的資源,並以完整模式進行部署:

Diagram showing change types for three resources, some of which already exist.

以下是對此範例中發生的情況的說明:

  • 範本將更新先前所部署,名為 storage-1 的儲存體帳戶。 SKU 正在從 LRS 變更為 GRS,而 owner 標籤的值正在變更為 Team A。對於此資源,假設狀況輸出會顯示修改變更類型。
  • 範本建立名為 cosmos-db-1,且尚不存在於資源群組中的新 Azure Cosmos DB 帳戶。 對於此資源,假設狀況輸出會顯示建立變更類型。
  • 範本中不含資源群組中既有的 Azure SQL 邏輯伺服器。 因為部署使用完整模式,所以對於此資源,假設狀況輸出會顯示刪除變更類型。 若部署使用增量模式,而不是完整模式,則會改為忽略變更類型。

確認您的部署

若要在部署範本之前先預覽變更,可在部署命令中,使用 -Confirm 參數。 若變更如您所預期,即可認可完成部署。

提示

使用 -Confirm 切換執行部署命令是很好的辦法,特別是當您使用完整模式進行部署時。 若使用 -Confirm 切換參數,可以在不想採用所建議的變更時停止作業。

若要在部署範本之前先預覽變更,可在部署命令中,使用 --confirm-with-what-if 引數。 若變更如您所預期,即可認可完成部署。

提示

使用 --confirm-with-what-if 引數執行部署命令是很好的辦法,特別是當您使用完整模式進行部署時。 若使用 --confirm-with-what-if 切換參數,可以在不想採用所建議的變更時停止作業。