使用 REST 接口获取订阅下虚拟机信息

在有些场景下,客户期望通过使用 REST 接口来统计某个订阅下的虚拟机信息,比如:获取订阅下某个 Size 虚拟机的总数量。实际上这是一个按属性进行分组统计的典型场景,对于这种需求,我们更建议使用 Powershell 或 SDK 来实现,因为实现起来较为简单方便。

无论哪种方式,我们均需要注意,虚拟机存在两种部署模型:ASM(经典模式)和 ARM(资源管理器模式),不同的部署模型也对应着不同的 REST 协议,SDK、Powershell 命令亦如此。

本文我们将重点介绍使用 REST 接口来达成这个需求的基本思路,一般来说这个过程需要通过程序调用 REST 接口,然后通过分组统计来实现具体的业务逻辑。

关于虚拟机 REST 接口的认证

无论是哪种部署模型的虚拟机,目前其 REST 接口都支持基于 AAD 的认证方式,早期的 ASM 虚拟机同样支持 x509 证书认证,出于一致性考虑,这里我们介绍两种都支持的 AAD 认证方式。

在调用接口时,我们需要提供一个基于 AAD 的认证 Token,总体来说有两种方式获取这个 Token:

方式一:浏览器从门户获取临时 Token

通过 Chrome 浏览器登录Azure 门户

按 F12 弹出开发者工具界面,选择 “Network” 选项卡,此时刷新登录页面,在 “Network” 中找到 “Select” 项,找到 “authorization”,该值即可用于认证我们调用的 REST 请求。

方式二:代码方式获取认证授权 Token

通过 PowerShell 获取认证凭据

PowerShell复制

# 1.在 PowerShell 中,登录 Azure 账户Login-AzureRmAccount-EnvironmentNameAzureChinaCloud# 2.选择当前订阅 IDSet-AzureRmContext-SubscriptionId"订阅 ID"# 3.创建 AD Application$azureAdApplication=New-AzureRmADApplication-DisplayName"georgeapp"-HomePage"https://www.georgeapp.org"-IdentifierUris"https://www.georgeapp.org/example"-Password"1QAZxsw2"$azureAdApplication# 4.为你的 AD 应用创建服务凭证New-AzureRmADServicePrincipal-ApplicationId$azureAdApplication.ApplicationId# 5.为服务凭证授权。如果想了解更多内容,请参考:https://azure.microsoft.com/zh-cn/documentation/articles/role-based-access-control-what-is/New-AzureRmRoleAssignment-RoleDefinitionNameContributor-ServicePrincipalName$azureAdApplication.ApplicationId

执行上述操作后,就可以获取可用的认证凭据信息:

tentantId:第二步执行完成后返回

subId:第二步指定的订阅 ID

clientId:第三步执行完成后返回

clientSecret:第三步中设置的 Password

通过代码获取认证 Token

Java 示例

Java复制

privateStringgetAccessToken(){    AuthenticationContext context =null;    AuthenticationResult result =null;    ExecutorService service =null;    service = Executors.newFixedThreadPool(1);try{        context =newAuthenticationContext(            String.format("%s/%s","https://login.chinacloudapi.cn", tentantId),true,            service);        ClientCredential cred =newClientCredential(            clientId,            clientSecret);        Future future =              context.acquireToken("https://management.chinacloudapi.cn/", cred,null);        result = future.get();    }catch(MalformedURLException e) {        e.printStackTrace();    }catch(InterruptedException e) {        e.printStackTrace();    }catch(ExecutionException e) {        e.printStackTrace();    }finally{        service.shutdown();    }returnresult.getAccessToken();}

Python 示例

Python复制

frommsrestazure.azure_active_directoryimportAADTokenCredentials, ServicePrincipalCredentialsclient_id ='16a94c84-c6ba-4f19-aa48-3353f8ffe1dd'client_secret ='123456'tenant_id ='b388b808-0ec9-4a09-a414-a7cbbd8b7edd'subscription_id ='e0fbea86-6cf2-4b2d-81e2-9c59f4f96bdd'credentials = ServicePrincipalCredentials(client_id,client_secret,tenant=tenant_id,china='true')print(credentials.token)

C# 示例

C#复制

publicstaticasyncTaskGetAccessTokenAsync(){    AuthenticationContext context =newAuthenticationContext(string.Format("https://login.chinacloudapi.cn/{0}", tenantId),false);varcredential =newUserPasswordCredential("订阅账号","订阅密码");    AuthenticationResult authenticationResult =awaitcontext.AcquireTokenAsync("https://management.chinacloudapi.cn/",        clientId,        credential);stringtoken = authenticationResult.AccessToken;returntoken;}

调用示例

ARM API(资源管理器模式):

实现原理:

先获取一个订阅下的所有资源组。

获取每个资源组下面的虚拟机信息。

根据每个虚拟机信息的 vmSize 进行分组统计(这个逻辑,比较适合用程序实现)。

参考接口:

Resource Groups - List

List the virtual machines in a resource group

测试准备:

Endpoint: 上述 API 连接中的 API 终结点是指向 Global Azure 服务,我们需要修改为 China Azure 终结点,即将https://management.azure.com换成https://management.chinacloudapi.cn。

Authorization: 参考《关于虚拟机 REST 接口的认证》部分。

接口测试:

Resource Groups - List

测试请求:https://management.chinacloudapi.cn/subscriptions//resourcegroups?api-version=2017-05-10

参数设置:

Authorization:上一步中浏览器中拿到的 Authorization 值

Content-Type:application/json

Postman 测试:

List the virtual machines in a resource group

测试请求:https://management.chinacloudapi.cn/subscriptions//resourceGroups//providers/Microsoft.Compute/virtualmachines?api-version=2016-04-30-preview

参数设置:

Authorization:上一步中浏览器中拿到的 Authorization 值

Content-Type:application/json

Postman 测试:

ASM API(经典模式):

实现原理:

先获取一个订阅下的所有云服务

获取每个云服务下的部署

获取每个部署下的角色

根据角色 RoleSize 进行分组统计

参考接口:

List Cloud Services

Get Deployment

Get Role

测试准备:

Endpoint: 上述 API 连接中的 API 终结点是指向 Global Azure 服务,我们需要修改为 China Azure 终结点,即将https://management.core.windows.net换成https://management.core.chinacloudapi.cn

同样可以基于 AAD 方式认证,参考前面《关于虚拟机 REST 接口的认证》部分。

接口测试:

List Cloud Services

测试请求:https://management.core.chinacloudapi.cn/subscriptions//services/

参数设置:

Authorization:Chrome 浏览器拿到的那个认证 Token

x-ms-version:2016-06-01

Postman 测试:

关于Get DeploymentGet Role的调用也非常简单,与List Cloud Services类似,不在赘述。

最后说明

通过 REST 接口,我们能获取到某个虚拟机的各种属性信息,但最终的业务达成还需要通过程序来实现,比如分组统计的逻辑。期望这篇文档对您有所帮助。

立即访问http://market.azure.cn

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354

推荐阅读更多精彩内容