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分好评谢谢。

  • 相关阅读:
    BZOJ 1191 HNOI2006 超级英雄hero
    BZOJ 2442 Usaco2011 Open 修建草坪
    BZOJ 1812 IOI 2005 riv
    OJ 1159 holiday
    BZOJ 1491 NOI 2007 社交网络
    NOIP2014 D1 T3
    BZOJ 2423 HAOI 2010 最长公共子序列
    LCA模板
    NOIP 2015 D1T2信息传递
    数据结构
  • 原文地址:https://www.cnblogs.com/he-yuan/p/3605805.html
Copyright © 2011-2022 走看看