【问题标题】:Get Status of all Azure RM VMs using Rest使用 Rest 获取所有 Azure RM VM 的状态
【发布时间】:2017-05-18 01:22:57
【问题描述】:

我正在尝试使用 Azure RM 的 rest 接口获取资源组中所有 VM 的状态。

我可以使用 URL 获取 1 个 VM 的状态 https://management.azure.com/subscriptions/[SubscriptionId]/resourceGroups/[ResourceGroup]/providers/Microsoft.Compute/virtualmachines/[serverName]?$expand=instanceView

我可以使用此 URL 获取所有虚拟机 https://management.azure.com/subscriptions/[SubscriptionId]/resourceGroups/[ResourceGroup]/providers/Microsoft.Compute/virtualmachines

但是这不会返回虚拟机的状态。我尝试传递 $expand=instanceView 但这在我获取所有虚拟机时没有任何影响。

【问题讨论】:

  • 我怀疑你能做到这一点,因为 instanceView 事物与 VM 资源相关联,而不是资源组或 Microsoft.Compute 提供程序。您必须遍历 VM 并调用 $expand=instanceView
  • 我知道这个问题提出已经 3 年了。但我的回答是今天的正确方法,因为这是一个实际且反复出现的需求。

标签: rest azure


【解决方案1】:

要从虚拟机获取所有状态,只需一个 API 请求/调用,您就可以使用:

GET https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Compute/virtualMachines?api-version=2020-06-01&statusOnly=true

来自此 Azure RESTful API - 虚拟机 - 列出所有 documentation

statusOnly=true 启用获取所有虚拟机的运行时状态 订阅中的机器。

因此设置statusOnly=true 允许您接收返回provisioningState 属性和instanceView 对象,其中包含PowerState,如“PowerState/running”、“PowerState/stopped”等...

此外,返回的instanceView 对象中还有许多其他有用且重要的信息。更多信息请参见documentation


经过数小时的搜索,这是我发现只需一次调用即可恢复所有实例状态的唯一方法。我看到的所有其他方法都是使用循环,并为每个 VM 执行一个 API 请求,这非常慢,并且取决于应用程序和 VM 的数量,这是不可接受的......

【讨论】:

  • 我知道文档说使用 statusOnly=true 参数来获取所有 VM 的状态,但是该标志没有影响。
  • @Rossini 您是否尝试过使用哪个端点?因为我相信您问题的第二个端点已被弃用。我找不到任何与之相关的文档。我也相信它不适用于这个标志/参数。我刚刚向邮递员提出了一个请求,使用我在此处指定的特定端点(路径和版本不同),将该参数设置为 true,然后我返回了所有信息,包括 instanceView 对象,以及所有PorwerStates 我的虚拟机。
  • 我错过了您使用不同的端点。我正在使用虚拟机 - 列出端点docs.microsoft.com/en-us/rest/api/compute/virtualmachines/list,而您正在使用列出所有端点docs.microsoft.com/en-us/rest/api/compute/virtualmachines/… 列出所有端点正是我正在寻找的,感谢您的帮助
【解决方案2】:

这不会返回虚拟机的状态。我尝试传递 $expand=instanceView 但是当我获取所有虚拟机时这没有任何影响。

this documentation,我们可以发现GET /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachines/{vmName}?api-version=2016-03-30[&$expand] 使我们能够使用$expand 选项来扩展属性,但是GET /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachines?api-version=2016-03-30 不支持$expand 选项。可能列出指定资源组中所有虚拟机的 API 方法不返回 IQueryable 或不允许查询选项。

正如 evilSnobu 所说,您可以尝试分两步进行:列出指定资源组中的所有虚拟机并遍历所有虚拟机并提取名称属性,然后发送请求以检索指定虚拟机的信息并使用 $expand in展开 instanceView 属性的请求的查询字符串。

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(string.Format("https://management.azure.com/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Compute/virtualMachines/{2}?api-version=2016-03-30&$expand=instanceView", subscriptionid, resourcegroup, vmname));

request.Method = "GET";
request.Headers["Authorization"] = "Bearer " + token;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2022-01-13
    • 2021-02-14
    相关资源
    最近更新 更多