1

我使用 Azure 节点 SDK 获取订阅的所有虚拟机:

var computeClient = new computeManagementClient.ComputeManagementClient(credentials, subscriptionId);
var clientNetworkManagement = new NetworkManagementClient(credentials, subscriptionId);

    computeClient.virtualMachines.listAll(function (err, result) {  
        returnResult(result);
    });

但是我订阅了超过 50 个虚拟机,并且该调用仅返回 50 个虚拟机的最大值。

使用这个函数 computeClient.virtualMachines.listAll 可以获得超过 50 个虚拟机? https://github.com/Azure-Samples/compute-node-manage-vm

谢谢

4

2 回答 2

1

我不知道这是否是解决问题的最佳方法,但我找到了解决方案:

msRestAzure.loginWithServicePrincipalSecret(clientId, secret, domain, function (err, credentials, subscriptions) {
    computeClient = new ComputeManagementClient(credentials, subscriptionId);

    computeClient.virtualMachines.listAll(function (err, result, httpRequest, response) {  
        let myResult = JSON.parse(response.body);
        console.log(result.length);
        nextLink = myResult.nextLink;

        console.log(nextLink);
        computeClient.virtualMachines.listAllNext(nextLink, function (err, result, request, response) { 
            console.log(result.length);
        });
    });
});

第一次调用 (listAll) 返回 50 Vm 和“nextLink”值。比我调用 listAllNext(nextLink,... 返回其他 39 Vm

于 2019-03-01T12:16:35.157 回答
1

我试图重现您的问题,但未能通过我的代码列出所有虚拟机,如下所示。在运行我的代码之前,我为我在 AzureAD 中注册的当前订阅的应用分配了一个角色Virtual Machine Contributor(或者您可以使用更高级别的角色,如Contributeror ),您可以参考官方文档了解它。OwnerManage access to Azure resources using RBAC and the Azure portal

var msRestAzure = require('ms-rest-azure');
var ComputeManagementClient = require('azure-arm-compute');

var clientId = process.env['CLIENT_ID'] || '<your client id>';
var domain = process.env['DOMAIN'] || '<your tenant id>';
var secret = process.env['APPLICATION_SECRET'] || '<your client secret>';
var subscriptionId = process.env['AZURE_SUBSCRIPTION_ID'] || '<your subscription id for listing all VMs in it>';

var computeClient;

msRestAzure.loginWithServicePrincipalSecret(clientId, secret, domain, function (err, credentials, subscriptions) {
    computeClient = new ComputeManagementClient(credentials, subscriptionId);
    computeClient.virtualMachines.listAll(function (err, result) {  
        console.log(result.length);
    });
});

在 Azure 门户上,我当前的订阅中有 155 个 VM 列表,如下图所示。但是,我的代码的结果只有 153 个虚拟机。我不知道为什么结果不同,但我的代码结果与 Azure CLI command 相同az vm list | grep vmId | wc -l

图 1. 我当前订阅的虚拟机数量

在此处输入图像描述

图 2. 我的代码的结果

在此处输入图像描述

图 3. Azure CLI 命令的结果az vm list|grep vmId|wc -l

在此处输入图像描述

根据我的经验,我猜您的问题是由为您的应用分配较低权限角色以仅列出您具有默认访问权限的虚拟机引起的。

任何问题或更新对于了解您的真正问题非常有帮助,请随时告诉我。

于 2019-03-01T07:30:53.383 回答