• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
求真 务实
代码简单,高效,易懂才是好代码.
博客园    首页    新随笔    联系   管理    订阅  订阅

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,而且只能添加一台。

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

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

 

posted @ 2014-03-17 19:02  Dino H.Y  阅读(653)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3