你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure 资源管理器模板概述
Azure 资源管理器模板允许用户通过定义资源之间的依赖关系,使用 JSON 语言以声明方式指定 Azure IaaS 基础结构。
若要详细了解如何创作可使用扩展的模板,请参阅创作扩展模板。
本文介绍如何对一些常见的 VM 扩展故障进行故障排除。
注释
尝试 VM 辅助,以便更快地进行诊断。 建议运行 VM assist for Windows 或 VM assist for Linux。 这些基于脚本的诊断工具可帮助你识别影响 Azure VM 来宾代理和整体 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 代理故障排除:
- 适用于 Windows VM 的对 Windows Azure 来宾代理进行故障排除
- 适用于 Linux VM 的对 Azure Linux 代理进行故障排除
查看特定扩展故障排除指南
针对某些扩展,提供介绍如何对其进行故障排除的特定页面。 可以在扩展故障排除中查找这些扩展及其页面的列表。
查看扩展的状态
如前所述,可以通过运行 PowerShell cmdlet 查找扩展的状态:
Get-AzVM -ResourceGroupName $RGName -Name $vmName -Status
或使用 CLI 命令:x
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,但在极少数情况下,它可能会触发需要重启的挂起更新。
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 扩展边栏选项卡中报告的状态。
他们还为 CSE Linux 版本 2.1.16+编写其执行的详细日志(例如:“var/log/azure/Microsoft.Azure.Extensions.CustomScript/handler.log” 适用于旧版 CSE 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 创建通用映像时,也可能发生这种情况。 请删除扩展,避免出现不一致的扩展状态。
已知问题
PowerShell 无法识别为内部或外部命令
在 RunCommand 扩展的输出中发现以下错误条目:
RunCommandExtension failed with "'powershell' isn't recognized as an internal or external command,"
分析
扩展在本地系统帐户下运行,因此当 RDP 进入 VM 时,powershell.exe 可能工作正常,但在使用 RunCommand 运行时失败。
解决方案
- 检查 PATH 环境变量中是否正确列出了 PowerShell:
- 打开“控制面板”
- 系统和安全性
- 系统
- “高级”选项卡 -> 环境变量
- 在“系统变量”下单击“编辑”,并确保 PowerShell 位于 PATH 环境变量中(通常为:“C:\Windows\System32\WindowsPowerShell\v1.0”)
- 重启 VM 或 WindowsAzureGuestAgent 服务,然后再次尝试运行命令。
命令无法识别为内部或外部命令
C:\WindowsAzure\Logs\Plugins<ExtensionName><Version>\CommandExecution.log 文件中包含以下内容:
Execution Error: '<command>' isn't recognized as an internal or external command, operable program or batch file.
分析
扩展在本地系统帐户下运行,因此当 RDP 进入 VM 时,powershell.exe 可能工作正常,但在使用 RunCommand 运行时失败。
解决方案
- 在 VM 中打开命令提示符并执行命令以重现错误。 VM 代理使用管理员 cmd.exe,可能需要在每次启动 cmd 时执行一些预先配置的命令。
- 你的 PATH 变量也可能配置错误,但这取决于出现问题的命令。
VMAccessAgent 失败,无法更新管理员帐户的远程桌面连接设置。 错误:System.Runtime.InteropServices.COMException (0x800706D9):终结点映射器中没有更多可用的终结点。
可在扩展的状态中看到以下内容:
Type Microsoft.Compute.VMAccessAgent
Version 2.4.8
Status Provisioning failed
Status level Error
Status message Cannot update Remote Desktop Connection settings for Administrator account. Error: System.Runtime.InteropServices.COMException (0x800706D9): There are no more endpoints available from the endpoint mapper. (Exception from HRESULT: 0x800706D9) at NetFwTypeLib.INetFwRules.GetEnumerator() at
Microsoft.WindowsAzure.GuestAgent.Plugins.JsonExtensions.VMAccess.RemoteDesktopManager.EnableRemoteDesktopFirewallRules()
at Microsoft.WindowsAzure.GuestAgent.Plugins.JsonExtensions.VMAccess.RemoteDesktopManager.EnableRemoteDesktop() at
分析
当 Windows 防火墙服务未运行时,可能会发生此错误。
解决方案
检查 Windows 防火墙服务是否已启用并且正在运行。 如果没有,请启用并启动它 - 然后再次尝试运行 VMAccessAgent。
根据验证过程,远程证书无效。
将在 WaAppAgent.log 中看到以下内容
System.Net.WebException: The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.
Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
分析
你的 VM 可能缺少“受信任的根证书颁发机构”中的 Baltimore CyberTrust 根证书。
解决方案
使用 certmgr.msc 打开证书控制台,然后检查证书是否在此处。
第三方 SSL 检查工具(如 ZScaler)可能会中断证书链。 应将此类工具配置为绕过 SSL 检查。