使用Rest获取所有Azure RM VM的状态

使用Rest获取所有Azure RM VM的状态,rest,azure,Rest,Azure,我正在尝试使用Azure RM的rest接口获取资源组中所有VM的状态 我可以使用URL获取1个VM的状态 ?$expand=instanceView 我可以使用这个URL获取所有虚拟机 但是,这不会返回虚拟机的状态。我尝试传递$expand=instanceView,但在获取所有虚拟机时,这没有任何影响 这不会返回虚拟机的状态。我尝试传递$expand=instanceView,但在获取所有虚拟机时,这没有任何影响 从中,我们可以发现GET/subscriptions/{subscripti

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

我可以使用URL获取1个VM的状态 ?$expand=instanceView

我可以使用这个URL获取所有虚拟机

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

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

从中,我们可以发现
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所说,您可以尝试分两个步骤来完成:列出指定资源组中的所有虚拟机,迭代所有虚拟机并提取name属性,然后发送请求以检索指定虚拟机的信息,并在请求的查询字符串中使用$expand来展开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;

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

GET https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Compute/virtualMachines?api-version=2020-06-01&statusOnly=true
从此Azure RESTful API-虚拟机-列出所有:

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

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

此外,在返回的
instanceView
对象中还有许多其他有用且重要的信息。更多关于这个



经过数小时的搜索,这是我发现的唯一一种方法,可以在一次调用中返回所有实例的状态。我看到的所有其他方法都是使用循环,并对每个VM执行一个API请求,这非常慢,而且取决于应用程序和VM的数量,这是不可接受的…

我怀疑您是否能够做到这一点,因为
instanceView
与VM资源相关,而不是资源组或Microsoft.Compute provider。您必须遍历虚拟机并调用
$expand=instanceView
。我知道这个问题提出已经三年了。但我的答案是正确的,当这是一个实际的和反复出现的需求时。我知道文档中说使用statusOnly=true参数来获取所有虚拟机的状态,但是该标志没有影响。@Rossini您用哪个端点尝试过吗?因为我相信你的问题的第二个终点是不赞成的。我找不到任何与此相关的文档。此外,我相信它不会与此标志/参数一起工作。我刚刚向postman发出了一个请求,使用我在这里指定的特定端点(路径和版本不同),将该参数设置为true,然后我得到了所有信息,包括
instanceView
对象,以及我的虚拟机的所有
PorwerState
。我没有注意到您使用的是不同的端点。我使用的是虚拟机-列表端点,当您使用列表所有端点时,列表所有端点正是我想要的,谢谢您的帮助