zoukankan      html  css  js  c++  java
  • 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分好评谢谢。

  • 相关阅读:
    如何替换文件中的部分内容?
    将文件中的行倒序输出,并写入文件
    如何统计文件中除去空行的数据的行数?
    统计文件行数,统计特殊行(例如,统计含有数字的行数)
    Array,String,Set,Map
    python 操作 word 图片 消失
    es6
    Promise
    英文
    前端框架vue.js系列(9):Vue.extend、Vue.component与new Vue
  • 原文地址:https://www.cnblogs.com/he-yuan/p/3605805.html
Copyright © 2011-2022 走看看