练习 - 测试和部署转换后的模板
你已创建 Bicep 文件来表示运行玩具卡车服务的虚拟机。 在承诺在管道中使用该文件之前,需要先验证该文件是否准确地代表了你当前的 Azure 环境。 在此模块中,你将测试 Bicep 文件,然后在现有 Azure 资源上部署该文件。
在此过程中,你将执行以下任务:
- 运行 What-if 命令以确定部署的效果。
- 部署模板并验证部署状态。
运行 What-if
在部署新的 Bicep 文件之前运行 What-if 命令。 此命令验证 Bicep 文件是否有效。 此命令还提供部署该文件时将在 Azure 环境中发生的更改列表。
注意
在真正的迁移过程中,应该针对生产和非生产环境运行 What-if 命令,并针对每个环境运行适当的参数集。 这有助于检测配置中任何可能尚未发现的差异。 本示例中使用单个环境,因此只需针对该环境运行 What-if 操作。
注意
用于 What-if 命令和后续模板部署的部署模式可能会带来风险。 完整模式会删除在资源组中定义但未在模板中指定的任何资源。 通常,这是一个很好的做法,因为它有助于确保 Bicep 代码已完成。 但是,此选项会带来一些风险,因为你可能在迁移过程中遗漏了某个资源。
在此练习中,你将使用完整模式运行 What-if 命令,以便检测可能遗漏的任何资源。 然后,在增量模式下运行部署。
在 Visual Studio Code 终端中,运行以下命令:
az deployment group what-if \ --mode Complete \ --resource-group ToyTruck \ --template-file main.bicep \ --parameters main.parameters.production.json
系统提示时,输入
virtualMachineAdminPassword
参数值的安全密码。
在 Visual Studio Code 终端中,运行以下命令:
New-AzResourceGroupDeployment ` -WhatIf ` -Mode Complete ` -ResourceGroupName ToyTruck ` -TemplateFile main.bicep ` -TemplateParameterFile main.parameters.production.json
系统提示时,输入
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
资源,使其包括 deleteOption
和 sku
的 publicIPAddress
属性:
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 命令
在 Visual Studio Code 终端中,运行以下命令:
az deployment group what-if \ --mode Complete \ --resource-group ToyTruck \ --template-file main.bicep \ --parameters main.parameters.production.json
系统提示时,输入
virtualMachineAdminPassword
参数值的安全密码。操作完成后,查看输出。 输出将如以下示例所示。 输出中未显示
deleteOption
和sku
属性。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.
在 Visual Studio Code 终端中,运行以下命令:
New-AzResourceGroupDeployment ` -WhatIf ` -Mode Complete ` -ResourceGroupName ToyTruck ` -TemplateFile main.bicep ` -TemplateParameterFile main.parameters.production.json
系统提示时,输入
virtualMachineAdminPassword
参数值的安全密码。操作完成后,查看输出。 输出将如以下示例所示。 输出中未显示
deleteOption
和sku
属性。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 操作指示模板具有预期结果。 现在你已经准备好部署模板。 如果此步骤成功,则不应看到任何效果。
在 Visual Studio Code 终端中,运行以下命令:
az deployment group create \ --resource-group ToyTruck \ --template-file main.bicep \ --parameters main.parameters.production.json
系统提示时,输入
virtualMachineAdminPassword
参数值的安全密码。部署在几秒内成功完成。
在 Azure 门户中打开资源组。 选择“2 个已成功”链接以查看部署列表。
部署成功:
在 Visual Studio Code 终端中,运行以下命令:
New-AzResourceGroupDeployment ` -ResourceGroupName ToyTruck ` -TemplateFile main.bicep ` -TemplateParameterFile main.parameters.production.json
系统提示时,输入
virtualMachineAdminPassword
参数值的安全密码。部署在几秒内成功完成。
在 Azure 门户中打开资源组。 选择“2 个已成功”链接以查看部署列表:
部署成功:
提示
在实际迁移中,还应运行冒烟测试来验证资源是否仍正常工作。 冒烟测试是确保你没有进行意外更改的最终检查。
清理资源
完成练习后,可以删除资源,以便不再为这些资源付费。
在 Visual Studio Code 终端中,运行以下命令:
az group delete --resource-group ToyTruck --yes --no-wait
资源组及其所有资源都会在后台删除。
Remove-AzResourceGroup -Name ToyTruck -Force