预测部署将使用 What-if 执行哪些操作

已完成

任何在环境中部署或修改资源的人都有下面的问题:

  • 是否会导致某些内容中断?
  • 是否要删除任何内容?
  • 此部署将如何影响现有资源?
  • 在点击“部署”按钮之前,能否验证预计将会发生的更改是否会在实际部署过程中发生?

“部署并希望达到最佳效果”并不是一个好方法。 更好的方法是使用 What-if 操作。 如果要尝试新的部署,该操作可帮助你预测部署结果。

Azure 资源管理器提供 What-if 操作,以在你部署模板时突出显示所做的更改。 what-if 操作不会对现有资源进行任何更改, 相反,如果将指定的模板部署在资源组和订阅级别,该操作将预测所做的更改。

备注

what-if 操作有时会显示资源将发生更改,但实际上并不会发生。 我们正在努力减少这些问题,但需要大家的帮助。 请报告这些问题

借助 what-if 操作,可将当前状态模型与所需状态模型进行比较。 What-if 操作会确认模板所做的更改是否符合预期,但不将这些更改应用于实际资源或这些资源的状态。

控制 what-if 结果的格式

New-AzResourceGroupDeployment Azure PowerShell cmdlet 会向资源组创建一个新部署。 向此命令添加 -Whatif 参数时,此命令会切换操作,即在你执行时,从执行部署变为仅报告所发生情况的预览。

az deployment group what-if 命令可提供在执行部署时所发生情况的预览。

可使用下面两种结果格式之一来控制 what-if 操作的文本输出量:

  • FullResourcePayloads。 通过包括此参数,可以获取详细输出,其中包含将更改的资源的列表。 输出还显示有关将根据模板更改的所有属性的详细信息。
  • ResourceIdOnly。 此模式返回将更改的资源的列表,不返回所有详细信息。

例如,假设更改在将单个存储帐户部署到现有环境的模板中的存储类型。

可运行以下 PowerShell 代码并要求资源管理器提供完整的资源有效负载:

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/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/ToyStorage

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

Resource changes: 1 to modify.

然后,你可重新运行该命令,但只需请求资源 ID:

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/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/ToyStorage

  ! Microsoft.Storage/storageAccounts/bz64gjjpidbuvi

Resource changes: 1 to deploy.

what-if 检测的更改类型

使用 What-if 操作时,会列出六种类型的更改:

类型 说明 效果
创建 资源当前不存在,但已在模板中定义。 将创建该资源。
删除 仅当为部署使用完成模式时,此更改类型才适用。 资源存在,但未在模板中定义。 如果使用增量模式进行部署,不会删除资源。 如果使用全量模式进行部署,会删除资源。 只针对支持在全量模式下删除的资源返回此更改类型。
忽略 资源存在,但未在模板中定义。 使用增量模式(它是默认部署模式)时,不会部署或修改资源。 如果使用全量模式进行部署,则会删除该资源。
NoChange 资源存在,且已在模板中定义。 将重新部署资源,但资源的属性不会更改。 当结果格式设置为 FullResourcePayloads(此为默认结果格式)时,将返回此更改类型。
修改 资源存在,且已在模板中定义。 将重新部署资源,且资源的属性会更改。 当结果格式设置为 FullResourcePayloads(此为默认结果格式)时,将返回此更改类型。
部署 资源存在,且已在模板中定义。 将重新部署资源。 资源的属性可能会更改,也可能不会更改。 当没有足够的信息来确定是否有任何属性发生更改时,操作将返回此更改类型。 仅当结果格式设置为 ResourceIdOnly 时,才会遇到此情况。

如果无需了解所有更改类型,可使用 -WhatIfExcludeChangeType 参数来忽略不感兴趣的类型。

如果无需了解所有更改类型,可使用 --what-if-exclude-change-types 参数来忽略不感兴趣的类型。

在脚本中使用 what-if 结果

你可能想要在脚本中或在自动部署流程期间使用 what-if 操作的输出。

你可使用 Get-AzResourceGroupDeploymentWhatIfResult cmdlet 获取结果。 然后,脚本会分析结果并执行你可能需要的任何自定义逻辑。

可通过将 --no-pretty-print 参数追加到 CLI 命令来获取原始 JSON 结果。 然后,脚本会分析结果并执行你可能需要的任何自定义逻辑。

部署模式和资源删除

有时,你需要在部署模板时确认删除资源。 为此,what-if 操作描述了你使用的部署模式。 如果使用全量部署模式,资源管理器会报告它将删除的资源,因为未在部署中定义这些资源。

让我们来看一个模板示例,该模板将更新现有资源并在全量模式下进行部署:

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

下面是对此示例中将发生情况的说明:

  • 该模板正在更新已部署的名为 storage-1 的存储帐户。 SKU 从 LRS 更改为 GRS,owner 标记则正在将值更改为“团队 A”。what-if 输出会显示此资源的“Modify”更改类型
  • 该模板正在创建名为 cosmos-db-1 的新 Azure Cosmos DB 帐户,该帐户尚不存在于资源组中。 what-if 输出会对该资源显示“Create”更改类型。
  • 该模板不包含资源组中已存在的 Azure SQL 逻辑服务器。 由于部署使用全量模式,因此 what-if 输出会对该资源显示“Delete”更改类型。 如果部署使用增量模式而非全量模式,更改类型将变为“Ignore”。

确认部署

若要在部署模板之前预览更改,请对部署命令使用 -Confirm 参数。 如果更改符合预期,请确认你想要完成此部署。

提示

最好使用 -Confirm 开关运行部署命令,尤其是在全量模式下部署时。 如果使用 -Confirm 开关,并且不喜欢建议的更改,可停止操作。

若要在部署模板之前预览更改,请对部署命令使用 --confirm-with-what-if 参数。 如果更改符合预期,请确认你想要完成此部署。

提示

最好使用 --confirm-with-what-if 参数部署命令,尤其是在全量模式下部署时。 如果使用 --confirm-with-what-if 开关,并且不喜欢建议的更改,可停止操作。