练习 - 使用 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 中安装此扩展。

创建共享模板

你从团队一直在使用的现有模板着手。 该模板将创建虚拟网络。

  1. 打开 Visual Studio Code。

  2. 新建一个名为 azuredeploy.json 的文件。

  3. 保存空文件,以便 Visual Studio Code 加载 ARM 模板工具。

    你可以选择“文件”>“另存为”,也可以在 Windows 中选择Ctrl+S(在 macOS 上选择 ⌘+S)。 请务必记住保存文件的位置。 例如,你可能希望创建脚本文件,并将其存储在其中。

  4. 将以下代码复制到 azuredeploy.json 中。

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {},
      "variables": {},
      "resources": [
        {
          "apiVersion": "2018-10-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"
                }
              }
            ]
          }
        }
      ]
    }
    
  5. 保存模板。

  1. 打开 Visual Studio Code。

  2. 新建一个名为 main.bicep 的文件。

  3. 保存空文件,以便 Visual Studio Code 加载 Bicep 工具。

    你可以选择“文件”>“另存为”,也可以在 Windows 中选择Ctrl+S(在 macOS 上选择 ⌘+S)。 请务必记住保存文件的位置。 例如,你可能希望创建脚本文件,并将其存储在其中。

  4. 将以下代码复制到 main.bicep 中。

    resource vnet 'Microsoft.Network/virtualNetworks@2018-10-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'
            }
          }
        ]
      }
    }
    
  5. 保存模板。

将模板部署到 Azure

若要将此模板部署到 Azure,需要从 Visual Studio Code 终端登录到 Azure 帐户。 请确保已安装 Azure PowerShell,并且登录的帐户与激活了沙盒的帐户相同。

  1. 在“终端”菜单中,选择“新终端”。 终端窗口通常在屏幕的下半部分打开。

  2. 如果终端窗口右侧显示的 shell 为“powershell”或“pwsh”,则会打开正确的 shell,你可以跳到下一部分。

    Visual Studio Code 终端窗口的屏幕截图,其中在 shell 下拉列表中显示了 pwsh 选项。

  3. 如果出现“powershell”或“pwsh”以外的 shell,请选择 shell 下拉箭头,然后选择“PowerShell”

    Visual Studio Code 终端窗口的屏幕截图,其中显示了终端 shell 下拉列表并选中了 PowerShell。

  4. 在终端 shell 列表中,选择“powershell”或“pwsh”。

    Visual Studio Code 终端窗口的屏幕截图,其中选择了 PowerShell 终端。

  5. 在终端中,转到保存模板的目录。 例如,如果将模板保存到 templates 文件夹,则可以使用以下命令:

    Set-Location -Path templates
    

安装 Bicep CLI

若要从 Azure PowerShell 中使用 Bicep,请安装 Bicep CLI

使用 Azure PowerShell 登录到 Azure

  1. 在 Visual Studio Code 终端中,运行以下命令:

    Connect-AzAccount
    

    在打开的浏览器中,登录到 Azure 帐户。

  2. 登录到 Azure 后,终端会显示与此帐户关联的订阅列表。

    如果已激活沙盒,则会显示名为“Concierge 订阅”的订阅。 请在本练习的其余部分使用此订阅。

  3. 为在此会话中运行的所有 Azure PowerShell 命令设置默认订阅。

    $context = Get-AzSubscription -SubscriptionName 'Concierge Subscription'
    Set-AzContext $context
    

    注意

    如果最近使用了多个沙盒,终端可能会显示多个 Concierge 订阅实例。 在这种情况下,请使用下面的两个步骤来设置一个默认订阅。 如果前面的命令成功,且仅列出一个 Concierge 订阅,则跳过下面的两个步骤。

  4. 获取订阅 ID。 运行以下命令将列出你的订阅及其 ID。 查看 Concierge Subscription,然后复制第二列中的 ID。 它类似于 cf49fbbc-217c-4eb6-9eb5-a6a6c68295a0

    Get-AzSubscription
    
  5. 将处于活动状态的订阅更改为“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,并记得使用你用于激活沙盒的同一帐户登录。

  1. 在“终端”菜单中,选择“新终端”。 终端窗口通常在屏幕的下半部分打开。

  2. 如果终端窗口右侧显示的 shell 为“bash”,则将打开正确的 shell,你可以跳到下一部分。

    Visual Studio Code 终端窗口的屏幕截图,其中显示了 bash 选项。

  3. 如果出现“bash”以外的 shell,请选择 shell 下拉箭头,然后选择“Azure Cloud Shell (Bash)”

    Visual Studio Code 终端窗口的屏幕截图,其中显示了终端 shell 下拉列表并选中了“Git Bash (默认)”。

  4. 在终端 shell 列表中,选择“bash”。

    Visual Studio Code 终端窗口的屏幕截图,其中选中了 bash 终端。

  5. 在终端中,转到保存模板的目录。 例如,如果将模板保存到 templates 文件夹,则可以使用以下命令:

    cd templates
    

安装 Bicep

运行以下命令以确保具有最新版本的 Bicep:

az bicep install && az bicep upgrade

登录 Azure

  1. 在 Visual Studio Code 终端中,运行以下命令登录到 Azure:

    az login
    
  2. 在打开的浏览器中,登录到 Azure 帐户。

    Visual Studio Code 终端显示与此帐户关联的订阅列表。

  3. 为在此会话中运行的所有 Azure CLI 命令设置默认订阅。

    az account set --subscription "Concierge Subscription"
    

    注意

    如果最近使用了多个沙盒,终端可能会显示多个 Concierge 订阅实例。 在这种情况下,请使用下面的两个步骤来设置一个默认订阅。 如果前面的命令成功,且仅列出一个 Concierge 订阅,则跳过下面的两个步骤。

  4. 获取 Concierge 订阅 ID。

     az account list \
       --refresh \
       --query "[?contains(name, 'Concierge Subscription')].id" \
       --output table
    
  5. 使用订阅 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,并且登录的帐户与激活了沙盒的帐户相同。

  1. 在“终端”菜单中,选择“新终端”。 终端窗口通常在屏幕的下半部分打开。

  2. 如果终端窗口右侧显示的 shell 为“powershell”或“pwsh”,则会打开正确的 shell,你可以跳到下一部分。

    Visual Studio Code 终端窗口的屏幕截图,其中在 shell 下拉列表中显示了 pwsh 选项。

  3. 如果出现“powershell”或“pwsh”以外的 shell,请选择 shell 下拉箭头,然后选择“PowerShell”

    Visual Studio Code 终端窗口的屏幕截图,其中显示了终端 shell 下拉列表并选中了 PowerShell。

  4. 在终端 shell 列表中,选择“powershell”或“pwsh”。

    Visual Studio Code 终端窗口的屏幕截图,其中选择了 PowerShell 终端。

  5. 在终端中,转到保存模板的目录。 例如,如果将模板保存到 templates 文件夹,则可以使用以下命令:

    Set-Location -Path templates
    

使用 Azure PowerShell 登录到 Azure

  1. 在 Visual Studio Code 终端中,运行以下命令:

    Connect-AzAccount
    

    在打开的浏览器中,登录到 Azure 帐户。

  2. 登录到 Azure 后,终端会显示与此帐户关联的订阅列表。

    如果已激活沙盒,则会显示名为“Concierge 订阅”的订阅。 请在本练习的其余部分使用此订阅。

  3. 为在此会话中运行的所有 Azure PowerShell 命令设置默认订阅。

    $context = Get-AzSubscription -SubscriptionName 'Concierge Subscription'
    Set-AzContext $context
    

    注意

    如果最近使用了多个沙盒,终端可能会显示多个 Concierge 订阅实例。 在这种情况下,请使用下面的两个步骤来设置一个默认订阅。 如果前面的命令成功,且仅列出一个 Concierge 订阅,则跳过下面的两个步骤。

  4. 获取订阅 ID。 运行以下命令将列出你的订阅及其 ID。 查看 Concierge Subscription,然后复制第二列中的 ID。 它类似于 cf49fbbc-217c-4eb6-9eb5-a6a6c68295a0

    Get-AzSubscription
    
  5. 将处于活动状态的订阅更改为“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,并记得使用你用于激活沙盒的同一帐户登录。

  1. 在“终端”菜单中,选择“新终端”。 终端窗口通常在屏幕的下半部分打开。

  2. 如果终端窗口右侧显示的 shell 为“bash”,则将打开正确的 shell,你可以跳到下一部分。

    Visual Studio Code 终端窗口的屏幕截图,其中显示了 bash 选项。

  3. 如果出现“bash”以外的 shell,请选择 shell 下拉箭头,然后选择“Azure Cloud Shell (Bash)”

    Visual Studio Code 终端窗口的屏幕截图,其中显示了终端 shell 下拉列表并选中了“Git Bash (默认)”。

  4. 在终端 shell 列表中,选择“bash”。

    Visual Studio Code 终端窗口的屏幕截图,其中选中了 bash 终端。

  5. 在终端中,转到保存模板的目录。 例如,如果将模板保存到 templates 文件夹,则可以使用以下命令:

    cd templates
    

登录 Azure

  1. 在 Visual Studio Code 终端中,运行以下命令登录到 Azure:

    az login
    
  2. 在打开的浏览器中,登录到 Azure 帐户。

    Visual Studio Code 终端显示与此帐户关联的订阅列表。

  3. 为在此会话中运行的所有 Azure CLI 命令设置默认订阅。

    az account set --subscription "Concierge Subscription"
    

    注意

    如果最近使用了多个沙盒,终端可能会显示多个 Concierge 订阅实例。 在这种情况下,请使用下面的两个步骤来设置一个默认订阅。 如果前面的命令成功,且仅列出一个 Concierge 订阅,则跳过下面的两个步骤。

  4. 获取 Concierge 订阅 ID。

     az account list \
       --refresh \
       --query "[?contains(name, 'Concierge Subscription')].id" \
       --output table
    
  5. 使用订阅 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 门户,确保你位于沙盒订阅中:

  1. 选择页面右上角的头像。

  2. 选择“切换目录”。 在列表中,选择“Microsoft Learn 沙盒”目录。

  3. 选择“资源组”。

  4. 选择 [沙盒资源组名称]

  5. 在“概述”中,你会看到一个成功的部署。

  6. 选择“1 个已成功”以查看部署的详细信息。

    Azure 门户中的部署界面屏幕截图,其中列出了一个部署且状态为“已成功”。

  7. 选择 main 部署,查看已部署的资源。 在本例中,已部署一个带有两个子网的虚拟网络(地址空间为 10.0.0.0/16)。

    Azure 门户中特定部署界面的屏幕截图,其中未列出任何资源。

    Azure 门户中特定部署界面的屏幕截图,其中列出了一项虚拟网络资源。

    让页面在浏览器中保持打开状态,以便稍后可以再次检查部署。

修改模板

  1. 在 Visual Studio Code 中的 azuredeploy.json 文件中,删除名为 Owner 的标记及其值。 完成后,虚拟网络的 tags 属性应如下所示:

    "tags": {
      "CostCenter": "12345"
    },
    
  2. 更新 addressPrefixes,将 /16 更改为 /15。 完成后,虚拟网络的 addressSpace 属性应如下所示:

    "addressSpace": {
      "addressPrefixes": [
        "10.0.0.0/15"
      ]
    },
    
  3. 删除名为 subnet001 的子网。 请确保删除整个子网对象。 完成后,虚拟网络的 subnets 属性应如下所示:

    "subnets": [
      {
        "name": "subnet002",
        "properties": {
          "addressPrefix": "10.0.1.0/24"
        }
      }
    ]
    
  4. 保存模板。

  1. 在 Visual Studio Code 的 main.bicep 文件中,删除名为 Owner 的标记及其值。 完成后,虚拟网络的 tags 属性应如下所示:

    tags: {
      'CostCenter': '12345'
    }
    
  2. 更新 addressPrefixes,将 /16 更改为 /15。 完成后,虚拟网络的 addressSpace 属性应如下所示:

    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/15'
      ]
    }
    
  3. 删除名为 subnet001 的子网。 请确保删除整个子网对象。 完成后,虚拟网络的 subnets 属性应如下所示:

    subnets: [
      {
        name: 'subnet002'
        properties: {
          addressPrefix: '10.0.1.0/24'
        }
      }
    ]
    
  4. 保存模板。

用修改后的模板运行 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 输出如下所示:

Azure CLI 的屏幕截图,其中显示了 what-if 操作的输出。

Azure PowerShell 的屏幕截图,其中显示了 what-if 操作的输出。

请注意,除了前缀,结果还采用了颜色编码:

  • 紫色和 ~ 表示任何修改
  • 绿色和 + 表示要创建的新资源
  • 橙色和 - 表示删除

删除模板中的资源

  1. 更新 Visual Studio Code 中的 azuredeploy.json 文件,并删除 resources 数组中的所有内容。 完成后,模板应如下所示:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "resources": [
      ]
    }
    
  2. 保存模板。

  1. 在 Visual Studio Code 的 main.bicep 文件中,删除文件的所有内容,但不删除文件。

  2. 保存模板。

在完成模式下使用“确认”选项进行部署

在接下来的这些步骤中,你将在现有环境中部署一个空模板。

警告

在实际场景中这样做将删除云中的所有内容。 以下代码是一个有趣的知识试验,但使用此模式时要小心。 至少使用 -Confirm 标志,以便在不喜欢建议的更改时停止此操作。

警告

在实际场景中这样做将删除云中的所有内容。 以下代码是一个有趣的知识试验,但使用此模式时要小心。 至少使用 --confirm-with-what-if 标志,以便在不喜欢建议的更改时停止此操作。

  1. 运行带有 -Mode Complete 标志的 New-AzResourceGroupDeployment,在全量模式下执行部署:

    New-AzResourceGroupDeployment `
    -Mode Complete `
    -Confirm `
    -TemplateFile main.bicep
    

    输出如下所示:

    Azure PowerShell 的屏幕截图,其中显示了部署确认操作的输出。

    请注意输出的最后一行是如何实现确认的。 它要求选择“y”或“n”来继续操作。

  2. 对于“[A] 全部是”,输入 A,执行部署并清理环境。

  1. 运行带有 -Mode Complete 标志的 New-AzResourceGroupDeployment,在全量模式下执行部署:

    New-AzResourceGroupDeployment `
    -Mode Complete `
    -Confirm `
    -TemplateFile azuredeploy.json
    

    输出如下所示:

    Azure PowerShell 的屏幕截图,其中显示了部署确认操作的输出。

    请注意输出的最后一行是如何实现确认的。 它要求选择“y”或“n”来继续操作。

  2. 对于“[A] 全部是”,输入 A,执行部署并清理环境。

  1. 运行带有标志 --mode Completeaz deployment group create,在完成模式下创建部署:

    az deployment group create \
      --mode Complete \
      --confirm-with-what-if \
      --template-file main.bicep
    

    输出如下所示:

    Azure CLI 的屏幕截图,其中显示了部署确认操作的输出。

    请注意输出的最后一行是如何实现确认的。 它要求选择“y”或“n”来继续操作。

  2. 输入“y”(表示“是”),执行部署并清理环境。

  1. 运行带有标志 --mode Completeaz deployment group create,在完成模式下创建部署:

    az deployment group create \
      --mode Complete \
      --confirm-with-what-if \
      --template-file azuredeploy.json
    

    输出如下所示:

    Azure CLI 的屏幕截图,其中显示了部署确认操作的输出。

    请注意输出的最后一行是如何实现确认的。 它要求选择“y”或“n”来继续操作。

  2. 输入“y”(表示“是”),执行部署并清理环境。

验证部署

返回之前使用的打开的浏览器。 验证虚拟网络是否已不再存在,如以下屏幕截图所示:

Azure 门户中完成部署界面的屏幕截图,其中不再列出虚拟网络资源。