练习 - 测试和部署转换后的模板

已完成

你已创建 Bicep 文件来表示运行玩具卡车服务的虚拟机。 在承诺在管道中使用该文件之前,需要先验证该文件是否准确地代表了你当前的 Azure 环境。 在此模块中,你将测试 Bicep 文件,然后在现有 Azure 资源上部署该文件。

在此过程中,你将执行以下任务:

  • 运行 What-if 命令以确定部署的效果。
  • 部署模板并验证部署状态。

运行 What-if

在部署新的 Bicep 文件之前运行 What-if 命令。 此命令验证 Bicep 文件是否有效。 此命令还提供部署该文件时将在 Azure 环境中发生的更改列表。

注意

在真正的迁移过程中,应该针对生产和非生产环境运行 What-if 命令,并针对每个环境运行适当的参数集。 这有助于检测配置中任何可能尚未发现的差异。 本示例中使用单个环境,因此只需针对该环境运行 What-if 操作。

注意

用于 What-if 命令和后续模板部署的部署模式可能会带来风险。 完整模式会删除在资源组中定义但未在模板中指定的任何资源。 通常,这是一个很好的做法,因为它有助于确保 Bicep 代码已完成。 但是,此选项会带来一些风险,因为你可能在迁移过程中遗漏了某个资源。

在此练习中,你将使用完整模式运行 What-if 命令,以便检测可能遗漏的任何资源。 然后,在增量模式下运行部署。

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

    az deployment group what-if \
      --mode Complete \
      --resource-group ToyTruck \
      --template-file main.bicep \
      --parameters main.parameters.production.json
    
  2. 系统提示时,输入 virtualMachineAdminPassword 参数值的安全密码。

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

    New-AzResourceGroupDeployment `
      -WhatIf `
      -Mode Complete `
      -ResourceGroupName ToyTruck `
      -TemplateFile main.bicep `
      -TemplateParameterFile main.parameters.production.json
    
  2. 系统提示时,输入 virtualMachineAdminPassword 参数值的安全密码。

查看 What-if 输出

查看 What-if 输出,如以下示例所示:

Note: The result may contain false positive predictions (noise).
You can help us improve the accuracy of the result by opening an issue here: https://aka.ms/WhatIfIssues.

Resource and property changes are indicated with these symbols:
  - Delete
  ~ Modify
  x NoEffect
  = NoChange

The deployment will update the following scope:

Scope: /subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/TOYTRUCK

  - Microsoft.Compute/disks/ToyTruckServer_disk1_23e6a144c4ea4049b3e2be24b78a9e81

      id:        "/subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/TOYTRUCK/providers/Microsoft.Compute/disks/ToyTruckServer_disk1_23e6a144c4ea4049b3e2be24b78a9e81"
      location:  "westus3"
      managedBy: "/subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/ToyTruck/providers/Microsoft.Compute/virtualMachines/ToyTruckServer"
      name:      "ToyTruckServer_disk1_23e6a144c4ea4049b3e2be24b78a9e81"
      sku.name:  "Premium_LRS"
      sku.tier:  "Premium"
      type:      "Microsoft.Compute/disks"

  ~ Microsoft.Network/networkInterfaces/toytruckserver123 [2022-05-01]
    - kind:                                              "Regular"
    - properties.allowPort25Out:                         true
    ~ properties.ipConfigurations: [
      ~ 0:

        - properties.privateIPAddress:                        "10.0.0.4"
        - properties.publicIPAddress.properties.deleteOption: "Detach"
        - properties.publicIPAddress.sku:

            name: "Basic"
            tier: "Regional"


      ]
    x properties.ipConfigurations[0].properties.primary: true

  = Microsoft.Compute/virtualMachines/ToyTruckServer [2022-08-01]
    x properties.storageProfile.osDisk.managedDisk.storageAccountType: "Premium_LRS"

  = Microsoft.Network/networkSecurityGroups/ToyTruckServer-nsg [2022-05-01]
  = Microsoft.Network/publicIPAddresses/ToyTruckServer-ip [2022-05-01]
  = Microsoft.Network/virtualNetworks/ToyTruck-vnet [2022-05-01]

Resource changes: 1 to delete, 1 to modify, 4 no change.

输出包含三条重要信息。 让我们来回顾一下每一条信息。

  • What-if 命令检测到托管磁盘将被删除。 该输出不准确。 创建虚拟机时会自动创建托管磁盘。 尽管托管磁盘出现在要删除的资源列表中,但虚拟机也会阻止它们被删除。 但是,始终建议采用谨慎的方法,因此,在接下来的步骤中,你将在增量模式下运行实际部署,以降低任何错误的风险。

  • What-if 命令检测到 privateIPAddress 资源的属性 networkInterface 已删除。 此结果是正常的,因为你有意删除了该属性。 privateIPAllocationMethod 属性设置为 Dynamic,因此即使有所更改,删除 privateIPAddress 属性也不会产生任何影响。

  • What-if 命令检测到将删除 networkInterface 资源的 publicIPAddress 的两个属性。 可添加这些属性来解决问题。

更新模板

在 main.bicep 中,更新 networkInterface 资源,使其包括 deleteOptionskupublicIPAddress 属性

resource networkInterface 'Microsoft.Network/networkInterfaces@2022-05-01' = {
  name: networkInterfaceName
  location: location
  properties: {
    ipConfigurations: [
      {
        name: 'ipconfig1'
        properties: {
          privateIPAllocationMethod: 'Dynamic'
          publicIPAddress: {
            id: publicIPAddress.id
            properties: {
              deleteOption: 'Detach'
            }
            sku: {
              name: 'Basic'
              tier: 'Regional'
            }
          }
          subnet: {
            id: virtualNetwork::defaultSubnet.id
          }
          primary: true
          privateIPAddressVersion: 'IPv4'
        }
      }
    ]
    enableAcceleratedNetworking: true
    enableIPForwarding: false
    disableTcpStateTracking: false
    networkSecurityGroup: {
      id: networkSecurityGroup.id
    }
    nicType: 'Standard'
  }
}

再次运行 What-if 命令

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

    az deployment group what-if \
      --mode Complete \
      --resource-group ToyTruck \
      --template-file main.bicep \
      --parameters main.parameters.production.json
    
  2. 系统提示时,输入 virtualMachineAdminPassword 参数值的安全密码。

  3. 操作完成后,查看输出。 输出将如以下示例所示。 输出中未显示 deleteOptionsku 属性。

    Note: The result may contain false positive predictions (noise).
    You can help us improve the accuracy of the result by opening an issue here: https://aka.ms/WhatIfIssues.
    
    Resource and property changes are indicated with these symbols:
      - Delete
      ~ Modify
      x NoEffect
      = NoChange
    
    The deployment will update the following scope:
    
    Scope: /subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/TOYTRUCK
    
      - Microsoft.Compute/disks/ToyTruckServer_disk1_23e6a144c4ea4049b3e2be24b78a9e81
    
          id:        "/subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/TOYTRUCK/providers/Microsoft.Compute/disks/ToyTruckServer_disk1_23e6a144c4ea4049b3e2be24b78a9e81"
          location:  "westus3"
          managedBy: "/subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/ToyTruck/providers/Microsoft.Compute/virtualMachines/ToyTruckServer"
          name:      "ToyTruckServer_disk1_23e6a144c4ea4049b3e2be24b78a9e81"
          sku.name:  "Premium_LRS"
          sku.tier:  "Premium"
          type:      "Microsoft.Compute/disks"
    
      ~ Microsoft.Network/networkInterfaces/toytruckserver123 [2022-05-01]
        - kind:                                              "Regular"
        - properties.allowPort25Out:                         true
        ~ properties.ipConfigurations: [
          ~ 0:
    
            - properties.privateIPAddress: "10.0.0.4"
    
          ]
        x properties.ipConfigurations[0].properties.primary: true
    
      = Microsoft.Compute/virtualMachines/ToyTruckServer [2022-08-01]
        x properties.storageProfile.osDisk.managedDisk.storageAccountType: "Premium_LRS"
    
      = Microsoft.Network/networkSecurityGroups/ToyTruckServer-nsg [2022-05-01]
      = Microsoft.Network/publicIPAddresses/ToyTruckServer-ip [2022-05-01]
      = Microsoft.Network/virtualNetworks/ToyTruck-vnet [2022-05-01]
    
    Resource changes: 1 to delete, 1 to modify, 4 no change.
    
  1. 在 Visual Studio Code 终端中,运行以下命令:

    New-AzResourceGroupDeployment `
      -WhatIf `
      -Mode Complete `
      -ResourceGroupName ToyTruck `
      -TemplateFile main.bicep `
      -TemplateParameterFile main.parameters.production.json
    
  2. 系统提示时,输入 virtualMachineAdminPassword 参数值的安全密码。

  3. 操作完成后,查看输出。 输出将如以下示例所示。 输出中未显示 deleteOptionsku 属性。

    Note: The result may contain false positive predictions (noise).
    You can help us improve the accuracy of the result by opening an issue here: https://aka.ms/WhatIfIssues.
    
    Resource and property changes are indicated with these symbols:
      - Delete
      ~ Modify
      x NoEffect
      = NoChange
    
    The deployment will update the following scope:
    
    Scope: /subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/TOYTRUCK
    
      - Microsoft.Compute/disks/ToyTruckServer_disk1_23e6a144c4ea4049b3e2be24b78a9e81
    
          id:        "/subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/TOYTRUCK/providers/Microsoft.Compute/disks/ToyTruckServer_disk1_23e6a144c4ea4049b3e2be24b78a9e81"
          location:  "westus3"
          managedBy: "/subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/ToyTruck/providers/Microsoft.Compute/virtualMachines/ToyTruckServer"
          name:      "ToyTruckServer_disk1_23e6a144c4ea4049b3e2be24b78a9e81"
          sku.name:  "Premium_LRS"
          sku.tier:  "Premium"
          type:      "Microsoft.Compute/disks"
    
      ~ Microsoft.Network/networkInterfaces/toytruckserver123 [2022-05-01]
        - kind:                                              "Regular"
        - properties.allowPort25Out:                         true
        ~ properties.ipConfigurations: [
          ~ 0:
    
            - properties.privateIPAddress: "10.0.0.4"
    
          ]
        x properties.ipConfigurations[0].properties.primary: true
    
      = Microsoft.Compute/virtualMachines/ToyTruckServer [2022-08-01]
        x properties.storageProfile.osDisk.managedDisk.storageAccountType: "Premium_LRS"
    
      = Microsoft.Network/networkSecurityGroups/ToyTruckServer-nsg [2022-05-01]
      = Microsoft.Network/publicIPAddresses/ToyTruckServer-ip [2022-05-01]
      = Microsoft.Network/virtualNetworks/ToyTruck-vnet [2022-05-01]
    
    Resource changes: 1 to delete, 1 to modify, 4 no change.
    

部署模板

你知道 Bicep 文件有效,并且 What-if 操作指示模板具有预期结果。 现在你已经准备好部署模板。 如果此步骤成功,则不应看到任何效果。

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

    az deployment group create \
      --resource-group ToyTruck \
      --template-file main.bicep \
      --parameters main.parameters.production.json
    
  2. 系统提示时,输入 virtualMachineAdminPassword 参数值的安全密码。

    部署在几秒内成功完成。

  3. 在 Azure 门户中打开资源组。 选择“2 个已成功”链接以查看部署列表

    Screenshot of the Azure portal that shows the resource group. The 2 Succeeded link is highlighted.

    部署成功:

    Screenshot of the Azure portal that shows the resource group deployments. The successful deployment is highlighted.

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

    New-AzResourceGroupDeployment `
      -ResourceGroupName ToyTruck `
      -TemplateFile main.bicep `
      -TemplateParameterFile main.parameters.production.json
    
  2. 系统提示时,输入 virtualMachineAdminPassword 参数值的安全密码。

    部署在几秒内成功完成。

  3. 在 Azure 门户中打开资源组。 选择“2 个已成功”链接以查看部署列表

    Screenshot of the Azure portal that shows the resource group. The 2 Succeeded link is highlighted.

    部署成功:

    Screenshot of the Azure portal that shows the resource group deployments. The successful deployment is highlighted.

提示

在实际迁移中,还应运行冒烟测试来验证资源是否仍正常工作。 冒烟测试是确保你没有进行意外更改的最终检查。

清理资源

完成练习后,可以删除资源,以便不再为这些资源付费。

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

az group delete --resource-group ToyTruck --yes --no-wait

资源组及其所有资源都会在后台删除。

Remove-AzResourceGroup -Name ToyTruck -Force