预测部署将使用 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 操作描述了你使用的部署模式。 如果使用全量部署模式,资源管理器会报告它将删除的资源,因为未在部署中定义这些资源。
让我们来看一个模板示例,该模板将更新现有资源并在全量模式下进行部署:
下面是对此示例中将发生情况的说明:
- 该模板正在更新已部署的名为
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
开关,并且不喜欢建议的更改,可停止操作。