Windows Azure Virtual Machine 之用程序控制Azure VM详解程序员

我们在很多时候可能会需要用程序来控制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 = 3389, Name = "RDP", Protocol = "tcp" },  
new InputEndpoint { LocalPort = 80, Port = 80, 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,而且只能添加一台。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/aiops/6336.html

(0)
上一篇 2021年7月16日 23:22
下一篇 2021年7月16日 23:22

相关推荐

发表回复

登录后才能评论