你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
对 Azure 开发测试实验室中实验室虚拟机上的项目进行故障排除
本文指导你了解 Azure 开发测试实验室虚拟机 (VM) 资源上项目失败的可能原因和故障排除步骤。
项目是在创建 VM 期间或之后可以安装在实验室 VM 上的工具、操作或软件。 实验室所有者可以预先选择在创建时应用到所有实验室 VM 的必需项目,实验室用户可以将项目应用到他们拥有的 VM。 几个可能的问题可能会导致项目无法安装和应用于实验室,或无法在实验室 VM 上正确运行。
当某个项目似乎停止响应时,第一步是确定流程停滞的原因。 项目安装可能在初始请求期间遭到阻止,也可能在请求执行期间失败。 可以从 Azure 门户或者从发生项目失败的 VM 来排查项目失败的原因。
在 Azure 门户中进行故障排除
如果项目未成功应用于实验室 VM,可以先在 Azure 门户中调查 VM 的状态。 可以找到有关 VM 状态的信息,确认它是否正在运行,并验证是否可以应用项目。 实验室 VM 的活动日志数据显示有关安装过程的条目。 可以检查这些条目以查找有关项目失败的信息。
检查 VM 状态
按照以下步骤在 Azure 门户中检查 VM 状态:
浏览到开发测试实验室中实验室 VM 的“概述”页,并确认计算机“正在运行”:
选择“项目”并打开实验室 VM 的项目列表:
选中“应用项目”选项,并确认实验室 VM 已准备好接受应用的项目:
当“应用项目”选项灰显时,无法将项目应用于实验室 VM,并且页面上会显示通知消息:
使用 PowerShell 命令
还可以使用 Azure PowerShell 检查实验室 VM 是否可以接收应用的项目。
以下 GET
命令返回值为 True 或 False 的 canApplyArtifacts
标志。 若要运行该命令,请将 $LabName/$VmName
参数替换为实验室名称和 VM 名称,并在 $LabRgName
参数中指定实验室资源组。
Select-AzSubscription -SubscriptionId $SubscriptionId | Out-Null
$vm = Get-AzResource `
-Name "$LabName/$VmName" `
-ResourceGroupName $LabRgName `
-ResourceType 'microsoft.devtestlab/labs/virtualmachines' `
-ApiVersion '2018-10-15-preview' `
-ODataQuery '$expand=Properties($expand=ComputeVm)'
$vm.Properties.canApplyArtifacts
调查失败的项目详细信息
项目可能停止响应,并最终在实验室 VM 的项目列表中显示为“失败”。
按照以下步骤调查失败的项目:
检查活动日志
为了安装项目,开发测试实验室将创建并部署一个请求使用自定义脚本扩展 (CSE) 的 Azure 资源管理器 (ARM) 模板。 此级别的错误会显示在订阅和包含实验室 VM 的资源组的活动日志中。
注意
查看活动日志时,可能需要展开安装过程条目才能查看失败错误摘要。
按照以下步骤在活动日志条目中检查与在实验室 VM 上安装或应用项目相关的失败:
浏览到实验室 VM 的“活动日志”页,然后查找状态为“失败”的项目:
选择该条目以打开详细信息窗格并查看日志信息:
如果尝试将项目直接应用到实验室 VM,请查找与“创建或更新虚拟机扩展”安装过程相关的失败错误。
如果要创建 VM 并在该过程中应用项目,请查找针对“创建或更新虚拟机”安装过程报告的失败错误。
窗格标题对应于条目标题,例如“将项目应用于虚拟机”:
在详细信息窗格上,选择“JSON”以查看 JSON 有效负载的内容。 可以在 JSON 文档的末尾看到错误:
调查项目存储库和实验室存储帐户
当开发测试实验室应用某个项目时,它会从连接的存储库中读取项目配置和文件。 如果项目无法安装或应用于实验室 VM,则问题可能与存储库访问相关。
默认情况下,开发测试实验室可以访问开发测试实验室的公共项目存储库。 还可以将实验室连接到专用存储库以访问自定义项目。 根据配置,实验室 VM 可能无法直接访问项目存储库。 开发测试实验室将项目缓存在首次初始化实验室时创建的实验室存储帐户中。
如果自定义项目安装失败,请确保专用存储库的个人访问令牌 (PAT) 未过期。 如果 PAT 已过期,则不会列出项目,并且引用该存储库中项目的任何脚本都会失败。
如果阻止了对存储帐户的访问,则可能会看到类似于以下示例的错误:
CSE Error: Failed to download all specified files. Exiting. Exception: Microsoft.WindowsAzure.Storage.StorageException: The remote server returned an error: (403) Forbidden. ---> System.Net.WebException: The remote server returned an error: (403) Forbidden.
当阻止了从 VM 到 Azure 存储服务的流量时,可能会遇到此错误。 此错误显示在实验室 VM 资源组的活动日志中。
通过以下步骤确定 Azure 存储帐户的存储库连接问题:
检查添加的网络安全组 (NSG)。 如果添加了订阅策略以便在所有虚拟网络中自动配置 NSG,该策略可能会影响用于创建实验室 VM 的虚拟网络。
验证所有 NSG 规则:
使用 IP 流验证确定是否有 NSG 规则阻止了传入或传出 VM 的流量。
查看有效的安全组规则,确保入站“允许”NSG 规则存在。 有关详细信息,请参阅使用有效的安全规则排查 VM 流量流问题。
检查实验室的默认存储帐户。
默认存储帐户是创建实验室期间创建的第一个存储帐户。 其名称通常以字母“a”开头并以多位数字结尾,例如
a<labname>#
。
有关深入的故障排除信息,请参阅配置 Azure 存储防火墙和虚拟网络。
在实验室计算机上进行故障排除
可以连接到项目失败的实验室 VM 并调查问题。
检查自定义脚本扩展日志文件
按照以下步骤查看 Windows VM 的自定义脚本扩展 (CSE) 日志文件:
连接到正在运行的开发测试实验室的实验室 VM。
打开文件资源管理器窗口,转到 C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\<CSE 版本>\Status\。 <CSE 版本> 的一个示例是
1.10.12
。打开 STATUS 文件并查看错误,例如 1.status。
有关在 Linux VM 上查找日志文件的说明,请参阅在 Linux 虚拟机上使用 Azure 自定义脚本扩展版本 2。
检查 Azure 虚拟机代理
确保已安装并准备好实验室 VM 的 Azure 虚拟机代理(VM 代理)。
当实验室 VM 首次启动时,或首次安装 CSE 以便为应用项目的请求提供服务时,实验室 VM 可能需要升级 VM 代理或等待 VM 代理初始化。 VM 代理依赖的服务可能需要花费很长时间才能完成初始化。
按照以下步骤确定 VM 代理是否导致项目停止响应:
连接到正在运行的开发测试实验室的实验室 VM。
打开文件资源管理器窗口,转到包含实验室 VM 日志文件的文件夹,例如 C:\WindowsAzure\logs。
打开 WaAppAgent.log 文件。
在日志文件中,查找显示 VM 代理启动、完成初始化以及发送第一个检测信号的条目。 扫描条目,查找遇到项目问题时的时间戳。 以下代码片段显示日志文件中的一些示例条目:
[00000006] [11/14/2019 05:52:13.44] [INFO] WindowsAzureGuestAgent starting. Version 2.7.41491.949 ... [00000006] [11/14/2019 05:52:31.77] [WARN] Waiting for OOBE to Complete ... ... [00000006] [11/14/2019 06:02:30.43] [WARN] Waiting for OOBE to Complete ... [00000006] [11/14/2019 06:02:33.43] [INFO] StateExecutor initialization completed. [00000020] [11/14/2019 06:02:33.43] [HEART] WindowsAzureGuestAgent Heartbeat.
在此示例中,启动 VM 代理花费了 10 分 20 秒。 延迟的原因是首次运行体验 (OOBE) 服务需要很长时间才能启动。 VM 代理的启动时间过长导致项目停止响应。
有关 Azure 扩展的常规信息,请参阅 Azure 虚拟机扩展和功能。 有关更多故障排除想法,请参阅 Azure 虚拟机代理概述。
调查脚本问题
项目安装可能失败的另一个原因是项目安装脚本的创作方式。
下面是潜在脚本问题的一些示例:
脚本具有必需参数,但在脚本执行期间未传递预期值。 如果允许用户将预期参数留空,并且未在 artifactfile.json 定义文件中指定默认值,则可能会发生这种情况。 因此,脚本由于等待用户输入而停止响应。 当脚本需要参数值时,最好定义默认值,并要求用户输入值。
脚本需要用户在脚本执行期间执行操作。 如果在等待用户执行操作时脚本执行出现长时间延迟,则可能会发生这种情况。 编写可以以无提示方式运行而不需要用户干预的脚本是一种很好的做法。
按照以下步骤确定脚本是否导致项目停止响应:
连接到正在运行的开发测试实验室的实验室 VM。
打开文件资源管理器窗口。
转到包含 VM 的项目安装脚本的下载文件夹,例如 C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\<CSE 版本>\Downloads\。 <CSE 版本> 的一个示例是
1.10.12
。对于后续步骤,可以使用此文件夹中的脚本,也可以将脚本复制到 VM 上的工作文件夹。
在 VM 上使用管理特权打开命令提示符窗口。
在命令提示符窗口中运行项目安装脚本。
按照脚本提示输入所需的参数值。 要调查是缺少用户输入还是用户操作延迟导致了问题,请尝试重现特定行为。
确定脚本是否表现出意外或有问题的行为。
根据需要更正实验室 VM 上的脚本,然后再次运行该脚本以确认问题是否已解决。
检查项目结构
自定义项目需采用正确的结构。 请务必确认项目安装脚本中的自定义项目实现了正确的结构。 以下资源提供了有助于完成此检查的信息:
请求脚本更新
可为开发测试实验室公共存储库中托管的项目提交建议的脚本更正。 有关详细信息,请参阅 README 文档中的 Contributions(贡献)部分。
获取支持
如需更多帮助,请尝试访问以下支持渠道之一:
搜索 Microsoft 社区网站资源以查找有关 Azure 开发测试实验室的信息,并访问 Stack Overflow 上的文章。
联系 @AzureSupport,这是用于改进客户体验的官方 Microsoft Azure 帐户。 Azure 支持人员会将你连接到 Azure 社区,从中可以获得解答、支持和专家建议。