Java 如何启用 ARM 虚拟机诊断
现象描述
如何通过 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 虚拟机诊断的更多相关文章
- Java虚拟机诊断利器
Java虚拟机诊断利器
- ubuntu 启用apache2 虚拟机配置
Ubuntu 启用apache2 虚拟机配置 http://jingyan.baidu.com/article/5d6edee20b78e999eadeecf7.html
- Azure ARM虚拟机部署反恶意软件-安全扩展
Azure虚拟机,默认情况下没有安装杀毒软件.如果您有此需求可以通过Azure 扩展进行安装,有关Azure反恶意软件的官方说明请参考:https://docs.azure.cn/zh-cn/secu ...
- 通过Azure Powershell获取asm及arm虚拟机的配置信息
1.asm虚拟机可以使用类似如下Azure Powershell命令获取虚拟机的基本信息,包括发行版本,虚拟机名称及size[备注:虚拟机需要是使用平台image创建的] PS C:\Users\he ...
- vSphere SDK for Java - 从模板部署虚拟机并配置IP地址
vSphere for Java类库:vijava 虚拟机配置类 package com.vmware.vcenter_event.VirtualMachine; import com.vmwa ...
- ARM 虚拟机使用同一个公共 IP 访问公网的解决方案
ARM 虚拟机使用同一个公共 IP 访问公网的解决方案 2017-2-21 作者 Azure 目前有两种部署模型:资源管理器 ARM 和经典部署模型 ASM.ASM 的虚拟机默认公用云服务的 VIP ...
- Python 基于固定 IP 来命名 ARM 虚拟机的实现
问题描述 希望通过 Python 批量创建 ARM 虚拟机,并且在虚拟机命名时加入固定 IP 信息,方便管理维护. 问题分析 在创建 ARM 虚拟机之前,先创建固定 IP,然后获取固定 IP 地址,创 ...
- 深入理解java:1. JVM虚拟机的构成
1.JVM虚拟机的构成 什么是Java虚拟机? 作为一个Java程序员,我们每天都在写Java代码,我们写的代码都是在一个叫做Java虚拟机的东西上执行的. 但是如果要问什么是虚拟机,恐怕很多人就会模 ...
- 【Java杂货铺】JVM#虚拟机加载机制
代码编译的结果从本地机器码变为字节码,是储存格式发展的一小步,却是编程语言发展的一大步--<深入理解Java虚拟机> 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转化 ...
随机推荐
- 【Java初探实例篇01】——Java语言基础
示例系列,将对每节知识辅以实际代码示例,通过代码实际编写,来深入学习和巩固学习的知识点. IDE:intellij IDEA: 语言:Java 本次示例:Java语言基础知识的应用. 创建包day_4 ...
- Linux信号和trap命令的使用
目录 信号介绍 信号列表 控制信号 Ctrl+c显示指定内容 使Ctrl+c无任何操作 处理多个信号 处理所有信号 恢复信号 实现跳板机(实例) 信号介绍 运行Shell脚本时,如果按下快捷键Ctrl ...
- top 动态查看进程
top 统计信息前五行是系统整体的统计信息 1.第一行是任务队列信息 同uptime质性命令结果一样. 06:47:11 up 6:39, 3 users, load average: 0.00, 0 ...
- 面试:C++输入数据
最近在做笔试题,相比与leetcode,笔试题都是要自己写输入输出的,每次在这里都浪费了不少时间,这篇文章总结了一下在C++中怎么向数组中输入数据. 1. 先输入数组大小,然后输入数据数据,中间以空格 ...
- SpringBoot入门 (十三) WebSocket使用
本文记录在SpringBoot中使用WebSocket. 一 什么是WebSocket WebSocket是基于TCP协议的一种网络协议,它实现了浏览器与服务器全双工通信,支持客户端和服务端之间相互发 ...
- KMP算法中next数组的理解与算法的实现(java语言)
KMP 算法我们有写好的函数帮我们计算 Next 数组的值和 Nextval 数组的值,但是如果是考试,那就只能自己来手算这两个数组了,这里分享一下我的计算方法吧. 计算前缀 Next[i] 的值: ...
- MySQL和Mariadb二进制日志binlog详解
Mariadb/mysql提供了4中不同的日志,分别是错误日志(error.log).普通日志(general log).慢日志(slow log)以及二进制日志(binlog).错误日志记录了系统启 ...
- 【转】常见六大Web 安全攻防解析
原文转自:https://segmentfault.com/a/1190000018073845 作者:浪里行舟 在互联网时代,数据安全与个人隐私受到了前所未有的挑战,各种新奇的攻击技术层出不穷.如何 ...
- jQuery 各类判断函数汇总
欢迎访问我的github:huanshen,有我的源码解析 常用的判断函数有type,isEmptyObject,isFunction,isWindow,isPlainObject,isArrayli ...
- Spring基础(6) : 普通Bean对象中保存ApplicationContext
public class Person implements ApplicationContextAware{ ApplicationContext context; public String na ...