Azure REST API (3) 使用REST API,操作Azure ARM VM
《Windows Azure Platform 系列文章目录》
笔者之前遇到一个客户,需求是当发生某一个特定条件的时候,对多台Azure ARM VM执行开机或者关机操作,这个时候就需要使用Azure REST API。
(当然也是可以使用Azure .NET SDK或者Java SDK,有兴趣的读者可以参考相关资料)
在使用Azure REST API操作ARM VM的时候,需要有四个步骤:
1.创建1个Azure Active Directory Application,设置Service Principal,设置Service Princial Permission,设置credential
2.查看Azure ARM REST API支持的Virtual Machine API Version
3.创建C# 代码,并设置Access Token
4.C#调用REST API
有关ARM VM REST API,请参考:https://docs.microsoft.com/en-us/rest/api/compute/virtualmachines
我们先开始第一部分:创建1个Azure Active Directory Application,设置Service Principal,设置Service Princial Permission,设置credential
其实这个步骤可以通过现有的Azure PowerShell来执行,具体的PowerShell链接下载地址:
(1)我们先找到Azure ARM虚拟机所在的资源组名称,比如这里用YourAzureChinaResourceGroup
(2)然后将上面的Azure PowerShell下载到本地D盘根目录,并且将扩展名重命名为ps1
(3)安装Azure PowerShell,并执行下面的命令:
D:\RegisterVsts2Mooncake.ps1 -subscriptionName '[YourAzureChinaSubscriptionName]' -password '[YourPassword]' -resourceGroupName '[YourAzureChinaResourceGroup]'
注意:第一个参数subscriptionName是订阅名称
password是密码。注意这个密码不一定是AzureChina登录的密码,我们可以设置为其他的密码
resourceGroupName是虚拟机所在的资源组名称
(4)执行完毕后,如下图:

把上面的Tenant ID记录下来
(5)因为上面的PowerShell脚本,Key的过期时间是1年。如果我们的代码需要长期使用的话,需要设置过期时间。
(6)我们登录Azure China Portal: https://portal.azure.cn
(7)我们点击Azure Active Directory,应用注册,然后点击“查看所有应用程序”。如下图:

(8)点击上图的"应用注册"后,会显示VSO开头的内容,我们选中该行:

(9)选中Settings,然后点击Keys,在Passoword,创建1个新的Key Descriptions,同时Expires设置为Never Expires
请注意:上面设置Passwords的时候,请先保存在记事本上,否则设置完毕后无法查看

把上面的Client ID和Client Secret记录下来
我们先开始第二部分:查看Azure ARM REST API支持的Virtual Machine API Version
(1)运行Azure PowerShell,执行下面的脚本
Add-AzureRmAccount -Environment AzureChinaCloud ((Get-AzureRmResourceProvider -ProviderNamespace Microsoft.Compute).ResourceTypes | Where-Object ResourceTypeName -eq virtualMachines).ApiVersions
(2)可以查看支持的API Version

然后执行第三部分:创建C#代码
(1)我们先创建1个C# Windows Form Project
(2)管理 NuGet包,增加Microsoft.IdentityModel.Clients.ActiveDirectory,如下图:

(3)在Form1.cs增加引用:using Microsoft.IdentityModel.Clients.ActiveDirectory;
(4)在Form1.cs增加如下代码:
string _tenantId = "这里输入第一部分第4步的Tenant ID";
string _clientId = "这里输入第一部分第9步的Client ID";
string _clientSecret = "这里输入第一部分第9步的Client Secret";
string _subscriptionId = "这里输入订阅ID";
string _resourceGroupName = "这里输入资源组名称";
AzureARMVMOperation armVMOperation; private void button1_Click(object sender, EventArgs e)
{
armVMOperation = new AzureARMVMOperation(); armVMOperation.Authenticate(_tenantId, _clientId, _clientSecret); armVMOperation.StartARMVM(_tenantId, _clientId, _clientSecret, _subscriptionId, _resourceGroupName, "需要开机的ARM VM Name");
armVMOperation.StartARMVM(_tenantId, _clientId, _clientSecret, _subscriptionId, _resourceGroupName, "需要开机的ARM VM Name");
}
(5)在Project中,增加AzureARMVMOperation.cs
请注意下面的API Version参数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using Microsoft.IdentityModel.Clients.ActiveDirectory; namespace AzureARMVM
{
class AzureARMVMOperation
{
public AzureARMVMOperation()
{ } public string Authenticate(string TentantID, string ClientID, string ClientSecret)
{
try
{
string authContextURL = "https://login.chinacloudapi.cn/" + TentantID;
var authenticationContext = new AuthenticationContext(authContextURL);
var credential = new ClientCredential(ClientID, ClientSecret);
var result = authenticationContext.AcquireTokenAsync(resource: "https://management.chinacloudapi.cn/", clientCredential: credential).Result;
return result.AccessToken.ToString();
}
catch (Exception ex)
{
return null;
}
} /// <summary>
/// 开机操作
/// </summary>
/// <param name="TentantID"></param>
/// <param name="ClientID"></param>
/// <param name="ClientSecret"></param>
/// <param name="SubscriptionId"></param>
/// <param name="ResourceGroupName"></param>
/// <param name="VMName"></param>
public void StartARMVM(string TentantID, string ClientID, string ClientSecret, string SubscriptionId, string ResourceGroupName, string VMName)
{
string result = Authenticate(TentantID, ClientID, ClientSecret);
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + result);
client.BaseAddress = new Uri("https://management.chinacloudapi.cn/"); PostOperation(client, $"/subscriptions/{SubscriptionId}/resourceGroups/{ResourceGroupName}/providers/Microsoft.Compute/virtualMachines/{VMName}/start?api-version=2017-12-01");
}
}
/// <summary>
/// 关机操作
/// </summary>
/// <param name="TentantID"></param>
/// <param name="ClientID"></param>
/// <param name="ClientSecret"></param>
/// <param name="SubscriptionId"></param>
/// <param name="ResourceGroupName"></param>
/// <param name="VMName"></param>
public void StopARMVM(string TentantID, string ClientID, string ClientSecret, string SubscriptionId, string ResourceGroupName, string VMName)
{
string result = Authenticate(TentantID, ClientID, ClientSecret);
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + result);
client.BaseAddress = new Uri("https://management.chinacloudapi.cn/"); PostOperation(client, $"/subscriptions/{SubscriptionId}/resourceGroups/{ResourceGroupName}/providers/Microsoft.Compute/virtualMachines/{VMName}/deallocate?api-version=2017-12-01");
}
} private void PostOperation(HttpClient client, string requestUri)
{
string data = "<someXml></someXml>";
StringContent queryString = new StringContent(data); using (var response = client.PostAsync(requestUri, queryString).Result)
{
response.Content.ReadAsStringAsync();
}
} }
}
然后我们执行Project,就可以测试和调试了。
Azure REST API (3) 使用REST API,操作Azure ARM VM的更多相关文章
- devOps开发(Web API 实例)dotnet core 和 Azure PaaS服务
使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例) 作者:陈希章 发表于 2017年12月19日 引子 这一篇文章将用一个完整的实例,给大家介绍如何 ...
- 【Azure Developer】使用Microsoft Graph API 批量创建用户,先后遇见的三个错误及解决办法
问题描述 在先前的一篇博文中,介绍了如何使用Microsoft Graph API来创建Azure AD用户(博文参考:[Azure Developer]使用Microsoft Graph API 如 ...
- 【Azure API 管理】解决API Management添加AAD Group时遇见的 Failed to query Azure Active Directory graph due to error 错误
问题描述 为APIM添加AAD Group时候,等待很长很长的时间,结果添加失败.错误消息为: Write Groups ValidationError :Failed to query Azure ...
- 05_Elasticsearch 单模式下API的增删改查操作
05_Elasticsearch 单模式下API的增删改查操作 安装marvel 插件: zjtest7-redis:/usr/local/elasticsearch-2.3.4# bin/plugi ...
- Elasticsearch 单模式下API的增删改查操作
<pre name="code" class="html">Elasticsearch 单模式下API的增删改查操作 http://192.168. ...
- 百度地图Api进阶教程-实例高级操作8.html
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 用Azure上Cognitive Service的Face API识别人脸
Azure在China已经发布了Cognitive Service,包括人脸识别.计算机视觉识别和情绪识别等服务. 本文将介绍如何用Face API识别本地或URL的人脸. 一 创建Cognitive ...
- Elasticsearch学习系列之单模式下API的增删改查操作
这里我们通过Elasticsearch的marvel插件实现单模式下API的增删改查操作 索引的初始化操作 创建索引之前可以对索引进行初始化操作,比如先指定shard数量以及replicas的数量 代 ...
- Spring WebFlux 学习笔记 - (一) 前传:学习Java 8 Stream Api (3) - Stream的终端操作
Stream API Java8中有两大最为重要的改变:第一个是 Lambda 表达式:另外一个则是 Stream API(java.util.stream.*). Stream 是 Java8 中处 ...
随机推荐
- display: table; 100%的宽度
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Gym 101655:2013Pacific Northwest Regional Contest(寒假自训第13场)
A .Assignments 题意:给定距离D,以及N个飞机的速度Vi,单位时间耗油量Fi,总油量Ci.问有多少飞机可以到达目的地. 思路:即问多少飞机满足(Ci/Fi)*Vi>=D ---- ...
- 如何上传本地项目到github
github作为git的代码托管,而许多大神都在上面托管自己的开源项目.现在,我来记录一下我是如何将本地项目上传到github上. 一.安装git工具(具体方法见百度) 二.配置全局 三.创建.ssh ...
- php 函数集锦
1.array_intersect_assoc()用于比较两个(或更多个)数组的键名和键值,并返回交集. <?php $a1=array("a"=>"red& ...
- NET Core 实战 Dapper 扩展数据访问
NET Core 实战:基于 Dapper 扩展你的数据访问方法 一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类帮我们实 ...
- 【Wannafly挑战赛22A计数器】【裴蜀定理】
https://www.nowcoder.com/acm/contest/160/A 题目描述 有一个计数器,计数器的初始值为0,每次操作你可以把计数器的值加上a1,a2,...,an中的任意一个整数 ...
- python------面向对象介绍之多态实例
一. 多态 一种接口,多种实现. 多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作. ...
- css中的margin(外边框)、border(边框)、padding(填充)的区别
Margin(外边距) - 清除边框外的区域,外边距是透明的. Border(边框) - 围绕在内边距和内容外的边框. Padding(内边距) - 清除内容周围的区域,内边距是透明的. Conten ...
- chaostoolkit 混沌工程工具集
chaostoolkit 目标是提供一个免费,开放,社区驱动的工具集以及api 以下为一张参考图 一些已经的扩展 基础设施/平台 Fault Injections: [chaostoolkit-kub ...
- lch 儿童围棋课堂 初级篇1 ( (李昌镐 著))
第1章 常用术语 第2章 吃子 第3章 死活:死活题初步 第4章 劫争 第5章 中盘 第6章 官子 第7章 形势判断 第8章 对杀技巧 第9章 手筋 第1章 常用术语 一 镇 在对方棋子上方隔一路落下 ...