现象描述

如何通过 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. Android Studio常用设置

    Android  Studio显示行号 File-->Setting(Ctrl+Alt+S),选择Editor-->General-->Appearance,右侧勾选Show lin ...

  2. webkit技术内幕读书笔记 (四)

    资源缓存 资源缓存的目的是为了提高资源使用的效率,其基本思想是建立一个资源的缓存池,当需要请求资源的时候先去资源池查找是否有相应的资源,如果没有则向服务器发送请求,webkit收到资源后将其设置到该资 ...

  3. tomcat 配置文件server.xml 详解 Connector Engine Host Context

    目录 一 server.xml 1.1 server 配置 1.2 service 配置 1.3 Executor 1.4 Connector 配置 1.5 Engine 其他tocmat 文章 一 ...

  4. 32-hadoop-hbase调优

    1, 数据膨胀后, 才对region进行分区, 效率比较低, 所以需要预创建region, 进行负载均衡写入 package com.wenbronk.hbase; import org.apache ...

  5. 微信emoji的code

    const MAP = [        "\xc2\xa9" => 'COPYRIGHT SIGN',        "\xc2\xae" => ...

  6. java运行时异常与一般异常有何异同?

    转自: http://blog.csdn.net/rainminism/article/details/51208572 Throwable是所有Java程序中错误处理的父类,有两种资类:Error和 ...

  7. HTTPS知识小结

    HTTPS知识小结 背景1:TCP握手 internet上的两台机器A,B要建立起HTTP连接了,在这之前要先建立TCP连接,情景大概是这样子的: A:你好,我跟你建立一个TCP好吗? B:好啊. A ...

  8. .33-浅析webpack源码之doResolve事件流(5)

    file => FileExistsPlugin 这个事件流快接近尾声了,接下来是FileExistsPlugin,很奇怪的是在最后才来检验路径文件是否存在. 源码如下: FileExistsP ...

  9. MarkdownPad编写博客技巧笔记

    说明 想约束自己使用博客来记录自己的内容,发现CSDN能导入.md文件,就查了查使用方式,发现确实比较好用的,本文档就是使用MarkdownPad编写,生成.md上传的.记录下使用方法 Markdow ...

  10. Java多线程--并行模式与算法

    Java多线程--并行模式与算法 单例模式 虽然单例模式和并行没有直接关系,但是我们经常会在多线程中使用到单例.单例的好处有: 对于频繁使用的对象可以省去new操作花费的时间: new操作的减少,随之 ...