我们在很多时候可能会需要用程序来控制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