现象描述

如何通过 Java 语言实现在创建 ARM 虚拟机时开启诊断,并配置相关指标。

 

实现思路

调研最高版本的 JAVA SDK(1.1.0)源码发现,SDK 层面并未提供任启动诊断和配置诊断的相关接口。然而官方提供了相关的 REST 接口,参考:如何增加及更新虚拟机扩展

这个接口为我们提供了向现有的 ARM 虚拟机添加或更新虚拟机扩展(vm extension)的功能,而我们在 Portal 上配置的“诊断功能”其实是一个名为 “IaaSDiagnostics” 的一个扩展。结合上述的 REST 接口,该 REST 请求示例如下:

复制

https://management.chinacloudapi.cn/subscriptions//resourceGroups//providers/Microsoft.Compute/virtualMachines//extensions/IaaSDiagnostics?api-version=2016-03-30

这是一个 Put 请求,请求的参数主要包括 Header 和 Request Body 两部分,官方连接中提供的解释略有不足,以下是我们关于相关参数的说明:

Header:主要包括 Authorization、Content-Type 及 Host 的设置:

Authorization:提供认证的凭据,如何获取这个值请参考下面认证凭据描述。

Content-Type:指定为 application/json,以 JSON 数据返回响应。

Host:指定为“management.chinacloudapi.cn”,终结点地址。

Request Body:关于扩展的配置信息,可以参考Azure Windows VM 扩展配置示例或以下模板:

复制

{

'type':'Microsoft.Compute/virtualMachines/extensions',

'id':'/subscriptions//resourceGroups//providers/Microsoft.Compute/virtualMachines//extensions/IaaSDiagnostics',

'location':'',

'name':'IaaSDiagnostics',

'properties':{

'type':'IaaSDiagnostics',

'publisher':'Microsoft.Azure.Diagnostics',

'typeHandlerVersion':'1.5',

'settings':{

'StorageAccount':'',

'xmlCfg':'<诊断 XML 配置的 Base64 编码值>'

},

'protectedSettings':{

'storageAccountName':'',

'storageAccountKey':'',

'storageAccountEndPoint':'https://core.chinacloudapi.cn'},

'autoUpgradeMinorVersion':true,

'instanceView':null

}

}

subId:虚拟机所属的订阅 ID

groupName:虚拟机所属的资源组名称

vmName:虚拟机名称

location:虚拟机地理位置(“China North” 或 “China East”)

storageAccountName:虚拟诊断数据存储账号名称

storageAccountKey:虚拟诊断数据存储账号秘钥

诊断 XML 配置的 Base64 编码值:这个值是指是将诊断指标配置做 Base64 编码计算得到的值。关于诊断指标配置参考诊断 1.2 配置架构诊断 1.3 及更高版本的配置架构。同时,我们在 GitHub 中提供了相关测试用例:WadCfg

接下来我们可以通过 Java 来模拟提交该请求,实现为虚拟机开启诊断功能。

认证凭据

Authorization Header 的值是基于 AAD 方式验证返回的 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/en-us/documentation/articles/role-based-access-control-what-is/New-AzureRmRoleAssignment-RoleDefinitionNameContributor-ServicePrincipalName$azureAdApplication.ApplicationId

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

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

subId:第二步指定的订阅 ID

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

clientSecret:第三步中设置的 Password

获取 Token :

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();}

Authorization: Bearer,以下是一个实际的示例:

BearereyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Im0yZmFQUUZkQzFEVGRmWU1pb09kaHdSblFUMCIsImtpZCI6Im0yZmFQUUZkQzFEVGRmWU1pb09kaHdSblFUMCJ9.eyJhdWQiOiJodHRwczovL21hbmFnZW1lbnQuY29yZS5jaGluYWNsb3VkYXBpLmNuLyIsImlzcyI6Imh0dHBzOi8vc3RzLmNoaW5hY2xvdWRhcGkuY24vYjM4OGI4MDgtMGVjOS00YTA5LWE0MTQtYTdjYmJkOGI3ZTliLyIsImlhdC26MTQ5ODcyMzc1OSwibmJmIjoxNDk4NzIzNzU5LCJleHAiOjE0OTg3Mjc2NTksImFjciI6IjEiLCJhaW8iOiJZMkJnWU5pN2ZUS2Q0WDFxaHFOeGkvUDNsWTJUUXU5ZG1McmR5OEpucnJuTkhMV0RnYzhCIiwiYW1yIjpbInB3ZCJdLCJhcHBpZCI6ImM0NGI0MDgzLTNiYjAtNDljMS1iNDdkLTk3NGU1M2NiZGYzYyIsImFwcGlkYWNyIjoiMiIsImVfZXhwIjoyNjI4MDAsImZhbWlseV9uYW1lIjoiVGVzdDAzIiwiZ2l2ZW5fbmFtZSI6IkNJRSIsImlwYWRkciI6IjEwNi4xMjAuNzguMTkwIiwibmFtZSI6IkNJRSBUZXN0MDMiLCJvaWQiOiI3Njg2OTZiYi1hYjVlLTQ0YzYtOGUxYi03MTIyYjYxYjVlODEiLCJwbGF0ZiI6IjMiLCJwdWlkIjoiMjAwMzNGRkY3MDAxQjlEMCIsInNjcCI6InVzZXJfaW1wZXJzb25hdGlvbiIsInN1YiI6ImZZVkRjRHRKTzlqcTY0VUllU0todnc3LVh3U1JqOGw5cjJvZ3pSRVkwUlkiLCJ0aWQiOiJiMzg4YjgwOC0wZWM5LTRhMDktYTQxNC1hN2NiYmQ4YjdlOWIiLCJ1bmlxdWVfbmFtZSI6IkNJRVRlc3QwM0BNaWNyb3NvZnRJbnRlcm5hbC5wYXJ0bmVyLm9ubXNjaGluYS5jbiIsInVwbiI6IkNJRVRlc3QwM0BNaWNyb3NvZnRJbnRlcm5hbC5wYXJ0bmVyLm9ubXNjaGluYS5jbiIsInZlciI6IjEuMCJ9.C3n47Eoqvo65hYQa9UrZ6yRmedPA4HM96ZEoIQFkyeaql-ezNJVklkO0qUjA567REUJnFvQ_zSDPufLvbrO-VAqCto3w3MN4Pjlkk-4qGTNEAzeoS6k4LOC0-YHHnP_DJGv159IyUoukArNNnWrMs4ELTOw_SbhqB5usTNs7N1GPoZPJCwj5wYryFVlwYA5PN_o0ysIEj3XcdMvY18SEhsz663EJzxe-fwA0XRn7wejbbbTtXlTxvQfno5ZcB8t1IraL51CbZqyNyojc4Ya7n3ZsW6sX12Tt5e0DpMO4QpkIdyrSo1xZ3Mi7uJBAJIol-XIXnrO93_8xTfjn5Mu8_g

运行测试

Java复制

String resourceName ="geogroup";String vmName ="geowin-test-005";String vmLocation ="China North";String storageAccountName ="";String storageAccountKey="";VmDiagnosticOperation diagnosticOperation =newVmDiagnosticOperation("tenant id","client id","client secret","sub id");String result = diagnosticOperation.EnableVMDiagnostic(resourceName, vmName, vmLocation,storageAccountName, storageAccountKey);System.out.println(result);

运行结果

 

示例代码

示例代码已经托管在 GitHub 中,请点击azure-vmop-demo查看或下载完整代码示例。

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

Java 如何启用 ARM 虚拟机诊断的更多相关文章

  1. Java虚拟机诊断利器

    Java虚拟机诊断利器  

  2. ubuntu 启用apache2 虚拟机配置

    Ubuntu 启用apache2 虚拟机配置 http://jingyan.baidu.com/article/5d6edee20b78e999eadeecf7.html

  3. Azure ARM虚拟机部署反恶意软件-安全扩展

    Azure虚拟机,默认情况下没有安装杀毒软件.如果您有此需求可以通过Azure 扩展进行安装,有关Azure反恶意软件的官方说明请参考:https://docs.azure.cn/zh-cn/secu ...

  4. 通过Azure Powershell获取asm及arm虚拟机的配置信息

    1.asm虚拟机可以使用类似如下Azure Powershell命令获取虚拟机的基本信息,包括发行版本,虚拟机名称及size[备注:虚拟机需要是使用平台image创建的] PS C:\Users\he ...

  5. vSphere SDK for Java - 从模板部署虚拟机并配置IP地址

    vSphere for Java类库:vijava    虚拟机配置类 package com.vmware.vcenter_event.VirtualMachine; import com.vmwa ...

  6. ARM 虚拟机使用同一个公共 IP 访问公网的解决方案

    ARM 虚拟机使用同一个公共 IP 访问公网的解决方案 2017-2-21 作者 Azure 目前有两种部署模型:资源管理器 ARM 和经典部署模型 ASM.ASM 的虚拟机默认公用云服务的 VIP ...

  7. Python 基于固定 IP 来命名 ARM 虚拟机的实现

    问题描述 希望通过 Python 批量创建 ARM 虚拟机,并且在虚拟机命名时加入固定 IP 信息,方便管理维护. 问题分析 在创建 ARM 虚拟机之前,先创建固定 IP,然后获取固定 IP 地址,创 ...

  8. 深入理解java:1. JVM虚拟机的构成

    1.JVM虚拟机的构成 什么是Java虚拟机? 作为一个Java程序员,我们每天都在写Java代码,我们写的代码都是在一个叫做Java虚拟机的东西上执行的. 但是如果要问什么是虚拟机,恐怕很多人就会模 ...

  9. 【Java杂货铺】JVM#虚拟机加载机制

    代码编译的结果从本地机器码变为字节码,是储存格式发展的一小步,却是编程语言发展的一大步--<深入理解Java虚拟机> 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转化 ...

随机推荐

  1. What does -> do in clojure?

    https://stackoverflow.com/questions/4579226/what-does-do-in-clojure

  2. Chrome 开发工具之Timeline/Performance

    之前有说到Element,Console,Sources大多运用于debug,Network可用于debug和查看性能,今天的主角Timeline(现已更名Performance)更多的是用在性能优化 ...

  3. CNN网络架构演进

    卷积神经网络可谓是现在深度学习领域中大红大紫的网络框架,尤其在计算机视觉领域更是一枝独秀.CNN从90年代的LeNet开始,21世纪初沉寂了10年,直到12年AlexNet开始又再焕发第二春,从ZF ...

  4. vmware workstation 下安装ubuntu

    安装时我是借鉴 https://blog.csdn.net/xiaohua0877/article/details/78507631 期间遇到几个问题 键盘不好使,解决办法是重新运行wmware wo ...

  5. Mybatis在非spring环境下配置文件中使用外部数据源(druidDatasource)

    Spring环境下, MyBatis可以通过其本身的增强mybatis-spring提供的org.mybatis.spring.SqlSessionFactoryBean来注入第三方DataSourc ...

  6. Tomcat学习总结(10)——Tomcat多实例冗余部署

    昨天在跟群友做技术交流的时候,了解到,有很多大公司都是采用了高可用的,分布式的,实例沉余1+台.但是在小公司的同学也很多,他们反映并不是所有公司都有那样的资源来供你调度.往往公司只会给你一台机器,因为 ...

  7. Font Awesome(一套很棒的图标库)

    Font Awesome 是一个非常方便的图标库.这些图标都是矢量图形,被保存在 .svg 的文件格式中.这些图标就和字体一样,你可以通过像素单位指定它们的大小,它们将会继承其父HTML元素的字体大小 ...

  8. 开源方案搭建可离线的精美矢量切片地图服务-5.Mapbox离线项目实现

    项目成果展示(所有项目文件都在阿里云的共享云虚拟主机上,访问地图可以会有点慢,请多多包涵). 01:中国地图:http://test.sharegis.cn/mapbox/html/3china.ht ...

  9. DataGridview启用列重新排序属性的作用

    DataGridview是winform中经常用的控件,今天来了解一下启用列重新排序属性的作用 默认没有选中是不能改变列前后顺序的 启用列重新排序后如下图可以拖动列标题(列标头)来改变列前后顺序

  10. 微信小程序入门篇

    微信小程序入门篇: 准备工作 IDE搭建 就不多说了,没有内测码去下载个破解版吧,我用了一下,学习完全够了!IDE破解版+安装教程 图片发自简书App 知识准备 JavaScrip还是要看看的,推荐教 ...