使用 what-if 预测部署将执行的作

已完成

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

  • 是否会导致某些内容中断?
  • 是否要删除任何内容?
  • 此部署将如何影响现有资源?
  • 在点击“部署”按钮之前,能否验证我预期会发生什么情况是否确实会发生在部署中?

部署和希望获得最佳效果并不是一种好方法。 更好的方法是使用 what-if 进行操作。 如果你尝试新部署,此操作可帮助你预见其后果。

Azure 资源管理器提供 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 代码并要求 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.

然后,可以重新运行命令,但只需请求资源 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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/ToyStorage

  ! Microsoft.Storage/storageAccounts/bz64gjjpidbuvi

Resource changes: 1 to deploy.

What-if 检测到的更改类型

使用“假设”操作时,它会列出六种类型的更改:

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

如果不需要知道所有更改类型,则可以使用 -WhatIfExcludeChangeType 参数省略你不感兴趣的类型。

如果不需要知道所有更改类型,则可以使用 --what-if-exclude-change-types 参数省略你不感兴趣的类型。

在脚本中使用 what-if 结果

你可能想要在脚本中使用 what-if操作的输出,或者将其作为自动化部署过程的一部分。

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

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

部署模式和资源删除

有时,在部署模板时需要确认删除资源。 为此,假设操作将考虑您使用的部署模式。 如果使用 完整的 部署模式,资源管理器会报告将删除的资源,因为它们未在部署中定义。

让我们看一个模板示例,该模板更新现有资源,并在完整模式下部署:

显示三个资源变更类型的关系图,其中部分资源已存在。

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

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

确认部署

若要在部署模板之前预览更改,请使用参数 -Confirm 和部署命令。 如果更改如您所预期,请确认您希望部署完成。

小窍门

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

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

小窍门

最好使用 --confirm-with-what-if 参数运行部署命令,尤其是在完全模式下部署时。 如果使用 --confirm-with-what-if 开关,您有机会在不喜欢建议的更改时停止该操作。