你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure Windows VM 扩展故障排除

Azure 资源管理器模板概述

Azure 资源管理器模板允许用户通过定义资源之间的依赖关系,使用 JSON 语言以声明方式指定 Azure IaaS 基础结构。

若要详细了解如何创作可使用扩展的模板,请参阅创作扩展模板

本文介绍如何对一些常见的 VM 扩展故障进行故障排除。

查看扩展状态

可以从 Azure PowerShell 执行 Azure 资源管理器模板。 一旦执行该模板,就可以从 Azure 资源浏览器或命令行工具查看扩展状态。

以下是示例:

Azure PowerShell:

Get-AzVM -ResourceGroupName $RGName -Name $vmName -Status

下面是示例输出:

Extensions:  {
  "ExtensionType": "Microsoft.Compute.CustomScriptExtension",
  "Name": "myCustomScriptExtension",
  "SubStatuses": [
    {
      "Code": "ComponentStatus/StdOut/succeeded",
      "DisplayStatus": "Provisioning succeeded",
      "Level": "Info",
      "Message": "    Directory: C:\\temp\\n\\n\\nMode                LastWriteTime     Length Name
          \\n----                -------------     ------ ----                              \\n-a---          9/1/2015   2:03 AM         11
          test.txt                          \\n\\n",
                  "Time": null
      },
    {
      "Code": "ComponentStatus/StdErr/succeeded",
      "DisplayStatus": "Provisioning succeeded",
      "Level": "Info",
      "Message": "",
      "Time": null
    }
  ]
}

扩展故障排除

验证 VM 代理是否正在运行且就绪

需要 VM 代理来管理、安装和执行扩展。 如果 VM 代理未运行或无法向 Azure 平台报告“就绪”状态,则扩展将无法正常工作。

请参阅以下页面来排查 VM 代理问题:

查看特定扩展故障排除指南

某些扩展有一个特定页面,用于描述如何对其进行故障排除。 可以在对扩展进行故障排除中查找这些扩展和页面的列表。

查看扩展状态

如上所述,可以通过运行 PowerShell cmdlet 找到扩展的状态:

Get-AzVM -ResourceGroupName $RGName -Name $vmName -Status

或运行 CLI 命令:

az vm extension show -g <RG Name> --vm-name <VM Name>  --name <Extension Name>

或者,在 Azure 门户中浏览到 VM 边栏选项卡/设置/扩展。 然后,可以单击扩展并检查其状态和消息。

在 VM 上重新运行扩展

如果使用自定义脚本扩展在 VM 上运行脚本,有时可能会遇到错误:VM 已成功创建但脚本却运行失败。 在这些情况下,从此错误中恢复的建议方法是删除该扩展并再次重新运行该模板。 注意:未来此功能将得到增强,不再需要卸载该扩展。

从 Azure PowerShell 删除扩展

Remove-AzVMExtension -ResourceGroupName $RGName -VMName $vmName -Name "myCustomScriptExtension"

删除该扩展后,可以重新执行模板在 VM 上运行脚本。

触发 VM 的新 GoalState

你可能会注意到某个扩展尚未执行,或者由于缺少“Windows Azure CRP 证书生成器”(该证书用于保护扩展的受保护设置的传输)而无法执行。 通过从虚拟机内重启 Windows 来宾代理,将会自动重新生成该证书:

  • 打开任务管理器
  • 转到“详细信息”选项卡
  • 找到 WindowsAzureGuestAgent.exe 进程
  • 右键单击并选择“结束任务”。 该进程将自动重启

还可以通过执行“VM 重新应用”来触发 VM 的新 GoalState。 VM 重新应用是一个在 2020 年引入的 API,用于重新应用 VM 的状态。 建议在可以容忍 VM 短暂停机时执行此操作。 虽然“重新应用”本身并不会导致 VM 重启,而且,在绝大多数情况下,调用“重新应用”也不会重新启动 VM,但还是会存在很小的风险:在“重新应用”触发新目标状态时,VM 模型的另外某个挂起的更新会被应用,而这一另外的更改可能会需要重启。

Azure 门户:

在门户中,选择 VM,并在左侧窗格中的“支持 + 故障排除”下,选择“重新部署 + 重新应用”,然后选择“重新应用” 。

Azure PowerShell(将“RG 名称”和“VM 名称”替换为你的值):

Set-AzVM -ResourceGroupName <RG Name> -Name <VM Name> -Reapply

Azure CLI(将“RG 名称”和“VM 名称”替换为你的值):

az vm reapply -g <RG Name> -n <VM Name>

如果“VM 重新应用”未起作用,则可从 Azure 管理门户为该 VM 添加新的空数据磁盘,在重新添加回证书后再将该磁盘删除。

查看 VM 中的扩展日志

如果前面的步骤不起作用,并且扩展仍处于失败状态,则下一步是在虚拟机中查看其日志。

在 Windows VM 上,扩展日志通常驻留在以下位置

C:\WindowsAzure\Logs\Plugins

扩展设置和状态文件将位于以下位置

C:\Packages\Plugins

在 Linux VM 上,扩展日志通常驻留在以下位置

/var/log/azure/

扩展设置和状态文件将位于以下位置

/var/lib/waagent/

每个扩展都不同,但它们通常遵循类似的原则:

扩展包和二进制文件在 VM 上下载(例如:Linux 的“/var/lib/waagent/custom-script/download/1”或 Windows 的“C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\Downloads\0”)。

其配置和设置通过 VM 代理从 Azure 平台传递到扩展处理程序(例如,Linux 的“/var/lib/waagent/Microsoft.Azure.Extensions.CustomScript-2.1.3/config”或 Windows 的“C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\RuntimeSettings”)

VM 内的扩展处理程序正在写入状态文件(例如,Linux 的“/var/lib/waagent/Microsoft.Azure.Extensions.CustomScript-2.1.3/status/1.status”或 Windows 的“C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\Status”),然后将该状态文件报告给 Azure 平台。 该状态是通过 PowerShell、CLI 或 Azure 门户中 VM 的扩展边栏选项卡报告。

它们还会写入其执行的详细日志(例如,Linux 的“/var/log/azure/custom-script/handler.log”或 Windows 的“C:\WindowsAzure\Logs\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\CustomScriptHandler.log”)。

若从现有 VM 重新创建 VM

有可能出现这种情况,即你创建的 Azure VM 基于来自另一个 Azure VM 的专用磁盘。 在这种情况下,旧 VM 可能包含扩展,因此会保留二进制文件、日志和状态文件。 新 VM 模型不会知道之前 VM 的扩展状态,并且可能为这些扩展报告错误状态。 我们强烈建议在创建新 VM 前从旧 VM 中删除扩展,然后在创建新 VM 后重新安装这些扩展。 从现有 Azure VM 创建通用映像时,也可能发生此种情况。 请删除扩展,以免扩展中的状态不一致。