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

时间:2017-01-03 20:54:50

标签: rest azure

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

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

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

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

2 个答案:

答案 0 :(得分:0)

  

这不会返回VM的状态。我尝试传递$ 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;

enter image description here

答案 1 :(得分:0)

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

var monsters = ["slug", "zombie", "wasp"];
var randomForMon = Math.floor(Math.random() * monsters.length);
var randMonster = monsters[randomForMon];
var user_answer = getNumber("answer_input");
var monstersAnswers = [null, null, null];


//when monster clicked, show fighting symbol and change screen
onEvent(randMonster, "click", function() {
  const monsterAnswer = monstersAnswers[randomForMon];
  if (monsterAnswer === false) {
    // don't do anything
    return;
  }
  hideElement("clickMonster_label");
  showSymbol();
  setTimeout(function() {
    setScreen("equation_screen");
  }, 1300);
  newEquation();
  var userAnswer = /* something */

  monstersAnswers[randomForMon] = correctAnswer === userAnswer;

});

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

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

因此,设置GET https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Compute/virtualMachines?api-version=2020-06-01&statusOnly=true 可让您接收statusOnly=true属性和一个provisioningState对象,其中包含instanceView,例如“ PowerState / running”,“ PowerState / stopped” “等等...

此外,返回的PowerState对象中还有许多其他有用和重要的信息。在documentation上对此有更多了解。


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