Windows Azure Virtual Machine 之用程序控制Azure VM

时间:2021-09-29 21:44:04

我们在很多时候可能会需要用程序来控制VM的创建,删除工作。

而在这些工作之中,用程序创建一个VM将会是一个非常复杂的过程,因为他涉及到很多步骤。

具体步骤如下

1 创建一个Hosted cloud service

2 选中一个Azure 中的image 来创建对应的VHD

3 选择一个路径来存放这个创建的VHD

4 选择这个VM需要开放的端口,需要远程登录的账号密码等等配置信息。

5 创建一个带有若干个虚拟机的部署。

如果想用代码来实现的话,现在有两种方式

1 用REST API

2 用Management Class Library

REST API的方法,网上已经有了(详情可参考 http://www.codeproject.com/Articles/601419/How-to-manage-Azure-IaaS-Programmatically )

这里就只讲述 第二种方式,用 Management Class Libraries。

以下是创建Azure VM 的代码。

 public static void QuickCreateVM()
{
try
{
ComputeManagementClient client = new ComputeManagementClient(cloudCredentials);
string vmName = "yuan2013vm"; //STEP1:Create Hosted Service
//Azure VM must be hosted in a hosted cloud service.
createCloudService(vmName, "East Asia", null); //STEP2:Construct VM Role instance
var vmRole = new Role()
{
RoleType = VirtualMachineRoleType.PersistentVMRole.ToString(),
RoleName = vmName,
Label = vmName,
RoleSize = VirtualMachineRoleSize.Small,
ConfigurationSets = new List<ConfigurationSet>(),
OSVirtualHardDisk = new OSVirtualHardDisk()
{
MediaLink = getVhdUri(string.Format("{0}.blob.core.windows.net/vhds", relatedStorageAccountName)),
SourceImageName = GetSourceImageNameByFamliyName("Windows Server 2012 Datacenter")
}
}; ConfigurationSet configSet = new ConfigurationSet
{
ConfigurationSetType = ConfigurationSetTypes.WindowsProvisioningConfiguration,
EnableAutomaticUpdates = true,
ResetPasswordOnFirstLogon = false,
ComputerName = vmName,
AdminUserName = "UserName",
AdminPassword = "Password1!",
InputEndpoints = new BindingList<InputEndpoint>
{
new InputEndpoint { LocalPort = , Name = "RDP", Protocol = "tcp" },
new InputEndpoint { LocalPort = , Port = , Name = "web", Protocol = "tcp" }
}
}; vmRole.ConfigurationSets.Add(configSet);
vmRole.ResourceExtensionReferences = null; //STEP3: Add Role instance to Deployment Parmeters
List<Role> roleList = new List<Role>() { vmRole };
VirtualMachineCreateDeploymentParameters createDeploymentParams = new VirtualMachineCreateDeploymentParameters
{ Name = vmName,
Label = vmName,
Roles = roleList,
DeploymentSlot = DeploymentSlot.Production
}; //STEP4: Create a Deployment with VM Roles.
client.VirtualMachines.CreateDeployment(vmName, createDeploymentParams);
Console.WriteLine("Create VM success");
}
catch (CloudException e)
{ throw e;
}
catch (Exception ex)
{
throw ex;
} } private static Uri getVhdUri(string blobcontainerAddress)
{
var now = DateTime.UtcNow;
string dateString = now.Year + "-" + now.Month + "-" + now.Day + now.Hour + now.Minute + now.Second + now.Millisecond; var address = string.Format("http://{0}/{1}-650.vhd", blobcontainerAddress, dateString);
return new Uri(address);
} private static void createCloudService(string cloudServiceName, string location, string affinityGroupName = null)
{
ComputeManagementClient client = new ComputeManagementClient(cloudCredentials);
HostedServiceCreateParameters hostedServiceCreateParams = new HostedServiceCreateParameters();
if (location != null)
{
hostedServiceCreateParams = new HostedServiceCreateParameters
{
ServiceName = cloudServiceName,
Location = location,
Label = EncodeToBase64(cloudServiceName),
};
}
else if (affinityGroupName != null)
{
hostedServiceCreateParams = new HostedServiceCreateParameters
{
ServiceName = cloudServiceName,
AffinityGroup = affinityGroupName,
Label = EncodeToBase64(cloudServiceName),
};
}
try
{
client.HostedServices.Create(hostedServiceCreateParams);
}
catch (CloudException e)
{
throw e;
} } private static string EncodeToBase64(string toEncode)
{
byte[] toEncodeAsBytes
= System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
string returnValue
= System.Convert.ToBase64String(toEncodeAsBytes);
return returnValue;
} private static string GetSourceImageNameByFamliyName(string imageFamliyName)
{
ComputeManagementClient client = new ComputeManagementClient(cloudCredentials);
var results = client.VirtualMachineImages.List();
var disk = results.Where(o => o.ImageFamily == imageFamliyName).FirstOrDefault(); if (disk != null)
{
return disk.Name;
}
else
{
throw new CloudException(string.Format("Can't find {0} OS image in current subscription"));
}
}

需要注意的问题有几下几点

1 "East Asia" 是数据中心的地址,你可以在portal中创建VM的时候找到相关选项。

2 在创建Azure虚拟机的时候,它的结构与Cloud service 类似,即顶层还是需要一个hosted service,接着是deployment,虚拟机必须在deployment之中。

3 在 Azure REST API 中有两个方法来添加虚拟机, Add ROLE和 CreateVMDeployment,经常有人搞不清这两个的区别,在了解第二点以后这里就很好理解了。

CreateVMDeployment,是先创建一个VM Deployment,然后再向其中添加若干个VM(通常是一个), 而ADD role 必须向已经存在的Deployment中添加VM,而且只能添加一台。

你可以从MSDN下载我上传的代码文件

如果觉得有用请给5分好评谢谢。

Windows Azure Virtual Machine 之用程序控制Azure VM的更多相关文章

  1. &lbrack;New Portal&rsqb;Windows Azure Virtual Machine &lpar;11&rpar; 在本地使用Hyper-V制作虚拟机模板,并上传至Azure &lpar;1&rpar;

    <Windows Azure Platform 系列文章目录> 本章介绍的内容是将本地Hyper-V的VHD,上传到Azure数据中心,作为自定义的虚拟机模板. 注意:因为在制作VHD的最 ...

  2. &lbrack;New Portal&rsqb;Windows Azure Virtual Machine &lpar;12&rpar; 在本地使用Hyper-V制作虚拟机模板,并上传至Azure &lpar;2&rpar;

    <Windows Azure Platform 系列文章目录> 本章介绍的内容是将本地Hyper-V的VHD,上传到Azure数据中心,作为自定义的虚拟机模板. 注意:因为在制作VHD的最 ...

  3. &lbrack;New Portal&rsqb;Windows Azure Virtual Machine &lpar;13&rpar; 在本地使用Hyper-V制作虚拟机模板,并上传至Azure &lpar;3&rpar;

    <Windows Azure Platform 系列文章目录> 本章介绍的内容是将本地Hyper-V的VHD,上传到Azure数据中心,作为自定义的虚拟机模板. 注意:因为在制作VHD的最 ...

  4. &lbrack;New Portal&rsqb;Windows Azure Virtual Machine &lpar;14&rpar; 在本地制作数据文件VHD并上传至Azure&lpar;1&rpar;

    <Windows Azure Platform 系列文章目录> 之前的内容里,我介绍了如何将本地的Server 2012中文版 VHD上传至Windows Azure,并创建基于该Serv ...

  5. &lbrack;New Portal&rsqb;Windows Azure Virtual Machine &lpar;15&rpar; 在本地制作数据文件VHD并上传至Azure&lpar;2&rpar;

    <Windows Azure Platform 系列文章目录> 在上一章内容里,我们已经将包含有OFFICE2013 ISO安装文件的VHD上传至Azure Blob Storage中了. ...

  6. &lbrack;New Portal&rsqb;Windows Azure Virtual Machine &lpar;16&rpar; 使用Azure PowerShell创建Azure Virtual Machine

    <Windows Azure Platform 系列文章目录> 注:本章内容和之前的[New Portal]Windows Azure Virtual Machine (12) 在本地制作 ...

  7. &lbrack;New Portal&rsqb;Windows Azure Virtual Machine &lpar;18&rpar; Azure Virtual Machine内部IP和外部IP

    <Windows Azure Platform 系列文章目录> 在开始本章内容之前,请读者熟悉以下2篇博文:       [New Portal]Windows Azure Virtual ...

  8. &lbrack;New Portal&rsqb;Windows Azure Virtual Machine &lpar;19&rpar; 关闭Azure Virtual Machine与VIP Address,Internal IP Address的关系&lpar;1&rpar;

    <Windows Azure Platform 系列文章目录> 默认情况下,通过Azure Management Portal创建的Public IP和Private IP都是随机分配的. ...

  9. &lbrack;New Portal&rsqb;Windows Azure Virtual Machine &lpar;20&rpar; 关闭Azure Virtual Machine与VIP Address,Internal IP Address的关系&lpar;2&rpar;

    <Windows Azure Platform 系列文章目录> 默认情况下,通过Azure Management Portal创建的Public IP和Private IP都是随机分配的. ...

随机推荐

  1. PHP的命名空间 与类是自动加载

    namespace 假设如果不使用namespace,那么每个类在一个项目中的名字就必须是固定的.因为php在new的时候不管是调用autoload还是调用已加载过的类,都存在一个类名对应的文件.所以 ...

  2. App开发流程之使用GCD

    GCD即为Grand Central Dispatch的缩写,是一种主要用于异步处理任务的安全的高性能解决方案. 在此不对比其他异步处理技术,只记录GCD的使用及说明. 先记录一些必要的概念:线程,同 ...

  3. PCA和LDA降维的比较

    PCA 主成分分析方法,LDA 线性判别分析方法,可以认为是有监督的数据降维.下面的代码分别实现了两种降维方式: print(__doc__) import matplotlib.pyplot as ...

  4. FZU 1914 Funny Positive Sequence

    题目链接:Funny Positive Sequence 题意:给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个数列的这n种变换里, A(0): a1, ...

  5. Visual C&plus;&plus; 开发心得与调试技巧

    自己平时收集的一些技巧与心得,这里分享出来,普及一下知识. 1.如何在Release状态下进行调试 Project->Setting=>ProjectSetting对话框,选择Releas ...

  6. 无可匹敌的创建job&lpar;细化很多细节&rpar;

    declare  jobno           binary_integer ;  rm_days         number := 15; --保留多少天的数据,单位天数  rm_hour    ...

  7. 【HDOJ】2195 Monotone SE Min

    简单DP.将[0,1]的浮点数离散化为[0,1000]的整数.最后再除以1000^2. /* 2195 */ #include <cstdio> #include <cstring& ...

  8. leetcode第31题--Longest Valid Parentheses

    Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...

  9. MVC中用Jpaginate分页

    MVC中用Jpaginate分页 So easy!(兼容ie家族)   看过几款分页插件,觉得Jpaginate比较简约,样式也比较容易的定制,而且体验也比较好,支持鼠标滑动效果.先上效果图: 整个过 ...

  10. DIY智能家居——零基础入门篇

    概要 本文主要根据笔者从零开始接触硬件,以小白视角开启IoT探索,根据相关资料DIY一个温湿度传感器.后经过探索发现新大陆--Home Assistant&Homebridge,最终实现了一个 ...