练习 - 使用 What-if 命令预览更改
备注
首次激活沙盒并接受这些条款后,你的 Microsoft 帐户将与名为“Microsoft Learn 沙盒”的新 Azure 目录相关联。 还会将你添加到名为“Concierge 订阅”的特殊订阅中。
在你所在的玩具公司,设计团队已让你更新用于配置虚拟网络的模板。 在此单元中,你将使用 what-if 来验证部署已更新的模板的影响。
在此过程中,你将:
- 创建和部署初始模板。
- 准备部署一个略微不同的模板,并使用 what-if 操作来查看预期更改。
- 使用完整部署来部署一个空模板,并使用 what-if 操作查看预期更改。
本练习使用适用于 Visual Studio Code 的 Azure 资源管理器工具。 请务必在 Visual Studio Code 中安装此扩展。
本练习使用适用于 Visual Studio Code 的 Bicep 扩展。 请务必在 Visual Studio Code 中安装此扩展。
创建共享模板
你从团队一直在使用的现有模板着手。 该模板将创建虚拟网络。
打开 Visual Studio Code。
新建一个名为 azuredeploy.json 的文件。
保存空文件,以便 Visual Studio Code 加载 ARM 模板工具。
你可以选择“文件”>“另存为”,也可以在 Windows 中选择Ctrl+S(在 macOS 上选择 ⌘+S)。 请务必记住保存文件的位置。 例如,你可能希望创建脚本文件,并将其存储在其中。
将以下代码复制到 azuredeploy.json 中。
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": {}, "variables": {}, "resources": [ { "apiVersion": "2024-01-01", "type": "Microsoft.Network/virtualNetworks", "name": "vnet-001", "location": "[resourceGroup().location]", "tags": { "CostCenter": "12345", "Owner": "Team A" }, "properties": { "addressSpace": { "addressPrefixes": [ "10.0.0.0/16" ] }, "enableVmProtection": false, "enableDdosProtection": false, "subnets": [ { "name": "subnet001", "properties": { "addressPrefix": "10.0.0.0/24" } }, { "name": "subnet002", "properties": { "addressPrefix": "10.0.1.0/24" } } ] } } ] }
保存模板。
打开 Visual Studio Code。
新建一个名为 main.bicep 的文件。
保存空文件,以便 Visual Studio Code 加载 Bicep 工具。
你可以选择“文件”>“另存为”,也可以在 Windows 中选择Ctrl+S(在 macOS 上选择 ⌘+S)。 请务必记住保存文件的位置。 例如,你可能希望创建脚本文件,并将其存储在其中。
将以下代码复制到 main.bicep 中。
resource vnet 'Microsoft.Network/virtualNetworks@2024-01-01' = { name: 'vnet-001' location: resourceGroup().location tags: { 'CostCenter': '12345' 'Owner': 'Team A' } properties: { addressSpace: { addressPrefixes: [ '10.0.0.0/16' ] } enableVmProtection: false enableDdosProtection: false subnets: [ { name: 'subnet001' properties: { addressPrefix: '10.0.0.0/24' } } { name: 'subnet002' properties: { addressPrefix: '10.0.1.0/24' } } ] } }
保存模板。
将模板部署到 Azure
若要将此模板部署到 Azure,需要从 Visual Studio Code 终端登录到 Azure 帐户。 请确保已安装 Azure PowerShell,并且登录的帐户与激活了沙盒的帐户相同。
在“终端”菜单中,选择“新终端”。 终端窗口通常在屏幕的下半部分打开。
如果终端窗口在右侧显示 pwsh 或 powershell,则表示已打开正确的 shell。 或者,如果你在右侧看到 PowerShell shell 图标,则可以选择它来启动 shell。
如果出现“pwsh”和“powershell”以外的 shell,请选择 shell 下拉箭头,然后选择“PowerShell”。
在终端中,转到保存模板的目录。 例如,如果将模板保存到 templates 文件夹,则可以使用以下命令:
Set-Location -Path templates
安装 Bicep CLI
若要从 Azure PowerShell 中使用 Bicep,请安装 Bicep CLI。
使用 Azure PowerShell 登录到 Azure
在 Visual Studio Code 终端中,运行以下命令:
Connect-AzAccount
在打开的浏览器中,登录到 Azure 帐户。
登录到 Azure 后,终端会显示与此帐户关联的订阅列表。
如果已激活沙盒,则会显示名为“Concierge 订阅”的订阅。 请在本练习的其余部分使用此订阅。
为在此会话中运行的所有 Azure PowerShell 命令设置默认订阅。
$context = Get-AzSubscription -SubscriptionName 'Concierge Subscription' Set-AzContext $context
注意
如果最近使用了多个沙盒,终端可能会显示多个 Concierge 订阅实例。 在这种情况下,请使用下面的两个步骤来设置一个默认订阅。 如果前面的命令成功,且仅列出一个 Concierge 订阅,则跳过下面的两个步骤。
获取订阅 ID。 运行以下命令将列出你的订阅及其 ID。 查看
Concierge Subscription
,然后复制第二列中的 ID。 它类似于aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
。Get-AzSubscription
将处于活动状态的订阅更改为“Concierge 订阅”。 请务必将 {Your subscription ID} 替换为复制的内容。
$context = Get-AzSubscription -SubscriptionId {Your subscription ID} Set-AzContext $context
设置默认资源组
你可以设置默认资源组,并忽略本练习中其他 Azure PowerShell 命令的参数。 将此默认值设置为在沙盒环境中为你创建的资源组。
Set-AzDefault -ResourceGroupName <rgn>[sandbox resource group name]</rgn>
若要将此模板部署到 Azure,你需要从 Visual Studio Code 终端登录到 Azure 帐户。 请确保安装了 Azure CLI,并记得使用你用于激活沙盒的同一帐户登录。
在“终端”菜单中,选择“新终端”。 终端窗口通常在屏幕的下半部分打开。
如果终端窗口在右侧显示 bash,则表示已打开正确的 shell。 或者,如果你在右侧看到 bash shell 图标,则可以选择它来启动 shell。
如果出现“bash”以外的 shell,请选择 shell 下拉箭头,然后选择“Git Bash”。
在终端中,转到保存模板的目录。 例如,如果将模板保存到 templates 文件夹,则可以使用以下命令:
cd templates
安装 Bicep
运行以下命令以确保具有最新版本的 Bicep:
az bicep install && az bicep upgrade
登录 Azure
在 Visual Studio Code 终端中,运行以下命令登录到 Azure:
az login
在打开的浏览器中,登录到 Azure 帐户。
Visual Studio Code 终端显示与此帐户关联的订阅列表。
为在此会话中运行的所有 Azure CLI 命令设置默认订阅。
az account set --subscription "Concierge Subscription"
注意
如果最近使用了多个沙盒,终端可能会显示多个 Concierge 订阅实例。 在这种情况下,请使用下面的两个步骤来设置一个默认订阅。 如果前面的命令成功,且仅列出一个 Concierge 订阅,则跳过下面的两个步骤。
获取 Concierge 订阅 ID。
az account list \ --refresh \ --query "[?contains(name, 'Concierge Subscription')].id" \ --output table
使用订阅 ID 设置默认订阅。 将 {your subscription ID} 替换为最新的 Concierge 订阅 ID。
az account set --subscription {your subscription ID}
设置默认资源组
当你使用 Azure CLI 时,可以设置默认资源组,并忽略本练习中其他 Azure CLI 命令的参数。 将默认值设置为在沙盒环境中为你创建的资源组。
az configure --defaults group="<rgn>[sandbox resource group name]</rgn>"
若要将此模板部署到 Azure,从 Visual Studio Code 终端登录到 Azure 帐户。 请确保已安装 Azure PowerShell,并且登录的帐户与激活了沙盒的帐户相同。
在“终端”菜单中,选择“新终端”。 终端窗口通常在屏幕的下半部分打开。
如果终端窗口在右侧显示 pwsh 或 powershell,则表示已打开正确的 shell。 或者,如果你在右侧看到 PowerShell shell 图标,则可以选择它来启动 shell。
如果出现“pwsh”和“powershell”以外的 shell,请选择 shell 下拉箭头,然后选择“PowerShell”。
在终端中,转到保存模板的目录。 例如,如果将模板保存到 templates 文件夹,则可以使用以下命令:
Set-Location -Path templates
使用 Azure PowerShell 登录到 Azure
在 Visual Studio Code 终端中,运行以下命令:
Connect-AzAccount
在打开的浏览器中,登录到 Azure 帐户。
登录到 Azure 后,终端会显示与此帐户关联的订阅列表。
如果已激活沙盒,则会显示名为“Concierge 订阅”的订阅。 请在本练习的其余部分使用此订阅。
为在此会话中运行的所有 Azure PowerShell 命令设置默认订阅。
$context = Get-AzSubscription -SubscriptionName 'Concierge Subscription' Set-AzContext $context
注意
如果最近使用了多个沙盒,终端可能会显示多个 Concierge 订阅实例。 在这种情况下,请使用下面的两个步骤来设置一个默认订阅。 如果前面的命令成功,且仅列出一个 Concierge 订阅,则跳过下面的两个步骤。
获取订阅 ID。 运行以下命令将列出你的订阅及其 ID。 查看
Concierge Subscription
,然后复制第二列中的 ID。 它类似于aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
。Get-AzSubscription
将处于活动状态的订阅更改为“Concierge 订阅”。 请务必将 {Your subscription ID} 替换为复制的内容。
$context = Get-AzSubscription -SubscriptionId {Your subscription ID} Set-AzContext $context
设置默认资源组
你可以设置默认资源组,并忽略本练习中其他 Azure PowerShell 命令的参数。 将此默认值设置为在沙盒环境中为你创建的资源组。
Set-AzDefault -ResourceGroupName <rgn>[sandbox resource group name]</rgn>
若要将此模板部署到 Azure,你需要从 Visual Studio Code 终端登录到 Azure 帐户。 请确保安装了 Azure CLI,并记得使用你用于激活沙盒的同一帐户登录。
在“终端”菜单中,选择“新终端”。 终端窗口通常在屏幕的下半部分打开。
如果终端窗口在右侧显示 bash,则表示已打开正确的 shell。 或者,如果你在右侧看到 bash shell 图标,则可以选择它来启动 shell。
如果出现“bash”以外的 shell,请选择 shell 下拉箭头,然后选择“Git Bash”。
在终端中,转到保存模板的目录。 例如,如果将模板保存到 templates 文件夹,则可以使用以下命令:
cd templates
登录 Azure
在 Visual Studio Code 终端中,运行以下命令登录到 Azure:
az login
在打开的浏览器中,登录到 Azure 帐户。
Visual Studio Code 终端显示与此帐户关联的订阅列表。
为在此会话中运行的所有 Azure CLI 命令设置默认订阅。
az account set --subscription "Concierge Subscription"
注意
如果最近使用了多个沙盒,终端可能会显示多个 Concierge 订阅实例。 在这种情况下,请使用下面的两个步骤来设置一个默认订阅。 如果前面的命令成功,且仅列出一个 Concierge 订阅,则跳过下面的两个步骤。
获取 Concierge 订阅 ID。
az account list \ --refresh \ --query "[?contains(name, 'Concierge Subscription')].id" \ --output table
使用订阅 ID 设置默认订阅。 将 {your subscription ID} 替换为最新的 Concierge 订阅 ID。
az account set --subscription {your subscription ID}
设置默认资源组
当你使用 Azure CLI 时,可以设置默认资源组,并忽略本练习中其他 Azure CLI 命令的参数。 将默认值设置为在沙盒环境中为你创建的资源组。
az configure --defaults group="<rgn>[sandbox resource group name]</rgn>"
使用 Azure PowerShell 部署模板
运行 New-AzResourceGroupDeployment
部署模板。
New-AzResourceGroupDeployment -TemplateFile main.bicep
终端中将显示文本“正在运行...”。 该部署需要一两分钟才能完成。
使用 Azure PowerShell 部署模板
运行 New-AzResourceGroupDeployment
部署模板。
New-AzResourceGroupDeployment -TemplateFile azuredeploy.json
终端中将显示文本“正在运行...”。 该部署需要一两分钟才能完成。
使用 Azure CLI 部署模板
运行 az deployment group create
部署模板。
az deployment group create --template-file main.bicep
该部署需要一两分钟才能完成。
使用 Azure CLI 部署模板
运行 az deployment group create
部署模板。
az deployment group create --template-file azuredeploy.json
该部署需要一两分钟才能完成。
验证部署
若要验证部署已创建且已发送到 Azure,可转到 Azure 门户,确保你位于沙盒订阅中:
选择页面右上角的头像。
选择“切换目录”。 在列表中,选择“Microsoft Learn 沙盒”目录。
选择“资源组”。
选择
[沙盒资源组名称] 。在“概述”中,你会看到一个成功的部署。
选择“1 个已成功”以查看部署的详细信息。
选择 main 部署,查看已部署的资源。 在本例中,已部署一个带有两个子网的虚拟网络(地址空间为 10.0.0.0/16)。
让页面在浏览器中保持打开状态,以便稍后可以再次检查部署。
修改模板
在 Visual Studio Code 中的 azuredeploy.json 文件中,删除名为
Owner
的标记及其值。 完成后,虚拟网络的tags
属性应如下所示:"tags": { "CostCenter": "12345" },
更新
addressPrefixes
,将/16
更改为/15
。 完成后,虚拟网络的addressSpace
属性应如下所示:"addressSpace": { "addressPrefixes": [ "10.0.0.0/15" ] },
删除名为
subnet001
的子网。 请确保删除整个子网对象。 完成后,虚拟网络的subnets
属性应如下所示:"subnets": [ { "name": "subnet002", "properties": { "addressPrefix": "10.0.1.0/24" } } ]
保存模板。
在 Visual Studio Code 的 main.bicep 文件中,删除名为
Owner
的标记及其值。 完成后,虚拟网络的tags
属性应如下所示:tags: { 'CostCenter': '12345' }
更新
addressPrefixes
,将/16
更改为/15
。 完成后,虚拟网络的addressSpace
属性应如下所示:addressSpace: { addressPrefixes: [ '10.0.0.0/15' ] }
删除名为
subnet001
的子网。 请确保删除整个子网对象。 完成后,虚拟网络的subnets
属性应如下所示:subnets: [ { name: 'subnet002' properties: { addressPrefix: '10.0.1.0/24' } } ]
保存模板。
用修改后的模板运行 what-if 命令
运行带有 -WhatIf
标志的 New-AzResourceGroupDeployment
来执行 What-if 操作。
New-AzResourceGroupDeployment `
-WhatIf `
-TemplateFile main.bicep
运行带有 -WhatIf
标志的 New-AzResourceGroupDeployment
来执行 What-if 操作。
New-AzResourceGroupDeployment `
-WhatIf `
-TemplateFile azuredeploy.json
运行 az deployment group what-if
以执行 what-if 操作:
az deployment group what-if \
--template-file main.bicep
运行 az deployment group what-if
以执行 what-if 操作:
az deployment group what-if \
--template-file azuredeploy.json
what-if 输出如下所示:
请注意,除了前缀,结果还采用了颜色编码:
- 紫色和 ~ 表示任何修改
- 绿色和 + 表示要创建的新资源
- 橙色和 - 表示删除
删除模板中的资源
更新 Visual Studio Code 中的 azuredeploy.json 文件,并删除
resources
数组中的所有内容。 完成后,模板应如下所示:{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "resources": [ ] }
保存模板。
在 Visual Studio Code 的 main.bicep 文件中,删除文件的所有内容,但不删除文件。
保存模板。
在完成模式下使用“确认”选项进行部署
在接下来的这些步骤中,你将在现有环境中部署一个空模板。
警告
在实际场景中这样做将删除云中的所有内容。 以下代码是一个有趣的知识试验,但使用此模式时要小心。 至少使用 -Confirm
标志,以便在不喜欢建议的更改时停止此操作。
警告
在实际场景中这样做将删除云中的所有内容。 以下代码是一个有趣的知识试验,但使用此模式时要小心。 至少使用 --confirm-with-what-if
标志,以便在不喜欢建议的更改时停止此操作。
运行带有
-Mode Complete
标志的New-AzResourceGroupDeployment
,在全量模式下执行部署:New-AzResourceGroupDeployment ` -Mode Complete ` -Confirm ` -TemplateFile main.bicep
输出如下所示:
请注意输出的最后一行是如何实现确认的。 它要求选择“y”或“n”来继续操作。
对于“[A] 全部是”,输入 A,执行部署并清理环境。
运行带有
-Mode Complete
标志的New-AzResourceGroupDeployment
,在全量模式下执行部署:New-AzResourceGroupDeployment ` -Mode Complete ` -Confirm ` -TemplateFile azuredeploy.json
输出如下所示:
请注意输出的最后一行是如何实现确认的。 它要求选择“y”或“n”来继续操作。
对于“[A] 全部是”,输入 A,执行部署并清理环境。
运行带有标志
--mode Complete
的az deployment group create
,在完成模式下创建部署:az deployment group create \ --mode Complete \ --confirm-with-what-if \ --template-file main.bicep
输出如下所示:
请注意输出的最后一行是如何实现确认的。 它要求选择“y”或“n”来继续操作。
输入“y”(表示“是”),执行部署并清理环境。
运行带有标志
--mode Complete
的az deployment group create
,在完成模式下创建部署:az deployment group create \ --mode Complete \ --confirm-with-what-if \ --template-file azuredeploy.json
输出如下所示:
请注意输出的最后一行是如何实现确认的。 它要求选择“y”或“n”来继续操作。
输入“y”(表示“是”),执行部署并清理环境。
验证部署
返回之前使用的打开的浏览器。 验证虚拟网络是否已不再存在,如以下屏幕截图所示: