Azure Virtual Machine 之 如何利用Management Class Libraries 创建VM详解程序员

之前发的blog简单的介绍了如何使用Management Class Libraries 来控制Azure platform。

但由于官方并没有提供文档,所以我们只能够通过自己研究来摸索使用该类库的方法。

在使用过程中我发现可以再抽象出一层中间层,从而让该类库的使用更趋近于Management REST API。

下面以创建一个Virtual Machine 为例让我们来了解如何使用该类库来操作Virtual Machine

首先我们要知道,在Azure Platform中,任何一个VM Instance都要运行在一个HostedService 里面的Deployment下面的。

所以在使用过程中我们需要首先创建一个Hosted Service。

我们可以通过以下两个方法来进行创建:

Azure Virtual Machine 之 如何利用Management Class Libraries 创建VM详解程序员

  public static void createCloudServiceByLocation(string cloudServiceName, string location) 
        { 
            ComputeManagementClient client = new ComputeManagementClient(getCredentials()); 
            HostedServiceCreateParameters hostedServiceCreateParams = new HostedServiceCreateParameters 
            { 
                ServiceName = cloudServiceName, 
                Location = location, 
                Label = EncodeToBase64(cloudServiceName), 
            }; 
            try 
            { 
                client.HostedServices.Create(hostedServiceCreateParams); 
            } 
            catch (CloudException e) 
            { 
                throw e; 
            } 
 
        } 
        public static void createCloudServiceByAffinityGroup(string cloudServiceName, string affinityGroupName) 
        { 
            ComputeManagementClient client = new ComputeManagementClient(getCredentials()); 
            HostedServiceCreateParameters hostedServiceCreateParams = new HostedServiceCreateParameters 
            { 
                ServiceName = cloudServiceName, 
                AffinityGroup = affinityGroupName, 
                Label = EncodeToBase64(cloudServiceName), 
            }; 
            try 
            { 
                client.HostedServices.Create(hostedServiceCreateParams); 
            } 
            catch (CloudException e) 
            { 
                throw e; 
            } 
 
        }

在有了HostedService之后,我们可以通过两种方式来创建VM。

第一种:首先创建一个Deployment,然后再通过添加角色来向这个Deployment中添加Virtual Machine,这样需要与Azure平台交互两次。

第二种:直接调用创建虚拟机部署,这样将在一个Request中创建一个虚拟机的Deployment并且将添加1或多个Virtual Machine到该Deployment下面。

我们可以通过创建自己的Extension Class Library来使得操作更趋向于REST API,一下是我抽象层的代码:

Azure Virtual Machine 之 如何利用Management Class Libraries 创建VM详解程序员

public static class MyVirtualMachineExtension 
{ 
/// <summary> 
/// Instantiation a new VM Role 
/// </summary> 
public static Role CreateVMRole(this IVirtualMachineOperations client, string cloudServiceName, string roleName, VirtualMachineRoleSize roleSize, string userName, string password, OSVirtualHardDisk osVHD) 
{ 
Role vmRole = new Role 
{ 
RoleType = VirtualMachineRoleType.PersistentVMRole.ToString(), 
RoleName = roleName, 
Label = roleName, 
RoleSize = roleSize, 
ConfigurationSets = new List<ConfigurationSet>(), 
OSVirtualHardDisk = osVHD 
}; 
ConfigurationSet configSet = new ConfigurationSet 
{ 
ConfigurationSetType = ConfigurationSetTypes.WindowsProvisioningConfiguration, 
EnableAutomaticUpdates = true, 
ResetPasswordOnFirstLogon = false, 
ComputerName = roleName, 
AdminUserName = userName, 
AdminPassword = password, 
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); 
return vmRole; 
} 
public static OSVirtualHardDisk CreateOSVHD(this IVirtualMachineImageOperations operation, string cloudserviceName, string vmName, string storageAccount, string imageFamiliyName) 
{ 
try 
{ 
var osVHD = new OSVirtualHardDisk 
{ 
MediaLink = GetVhdUri(string.Format("{0}.blob.core.windows.net/vhds", storageAccount), cloudserviceName, vmName), 
SourceImageName = GetSourceImageNameByFamliyName(operation, imageFamiliyName) 
}; 
return osVHD; 
} 
catch (CloudException e) 
{ 
throw e; 
} 
} 
private static string GetSourceImageNameByFamliyName(this IVirtualMachineImageOperations operation, string imageFamliyName) 
{ 
var disk = operation.List().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")); 
} 
} 
private static Uri GetVhdUri(string blobcontainerAddress, string cloudServiceName, string vmName, bool cacheDisk = false, bool https = false) 
{ 
var now = DateTime.UtcNow; 
string dateString = now.Year + "-" + now.Month + "-" + now.Day; 
var address = string.Format("http{0}://{1}/{2}-{3}-{4}-{5}-650.vhd", https ? "s" : string.Empty, blobcontainerAddress, cloudServiceName, vmName, cacheDisk ? "-CacheDisk" : string.Empty, dateString); 
return new Uri(address); 
} 
public static void CreateVMDeployment(this IVirtualMachineOperations operations, string cloudServiceName, string deploymentName, List<Role> roleList, DeploymentSlot slot = DeploymentSlot.Production) 
{ 
try 
{ 
VirtualMachineCreateDeploymentParameters createDeploymentParams = new VirtualMachineCreateDeploymentParameters 
{ 
Name = deploymentName, 
Label = cloudServiceName, 
Roles = roleList, 
DeploymentSlot = slot 
}; 
operations.CreateDeployment(cloudServiceName, createDeploymentParams); 
} 
catch (CloudException e) 
{ 
throw e; 
} 
} 
public static void AddRole(this IVirtualMachineOperations operations, string cloudServiceName, string deploymentName, Role role, DeploymentSlot slot = DeploymentSlot.Production) 
{ 
try 
{ 
VirtualMachineCreateParameters createParams = new VirtualMachineCreateParameters 
{ 
RoleName = role.Label, 
RoleSize = role.RoleSize, 
OSVirtualHardDisk = role.OSVirtualHardDisk, 
ConfigurationSets = role.ConfigurationSets, 
AvailabilitySetName = role.AvailabilitySetName, 
DataVirtualHardDisks = role.DataVirtualHardDisks 
}; 
operations.Create(cloudServiceName, deploymentName, createParams); 
} 
catch (CloudException e) 
{ 
throw e; 
} 
} 
}

整体programe代码如下:

Azure Virtual Machine 之 如何利用Management Class Libraries 创建VM详解程序员

 class Program 
{ 
public const string base64EncodedCertificate = ""; 
public const string subscriptionId = ""; 
public static string vmName = "Azure111"; 
public static string location = "East Asia"; 
public static string storageAccountName = "superdino"; 
public static string userName = "Dino"; 
public static string password = "PassWord1!"; 
public static string imageFamiliyName = "Windows Server 2012 Datacenter"; 
static void Main(string[] args) 
{ 
ComputeManagementClient client = new ComputeManagementClient(getCredentials()); 
//You need a hosted service host VM. 
try 
{ 
client.HostedServices.Get(vmName); 
} 
catch (CloudException e) 
{ 
createCloudServiceByLocation(vmName, location); 
} 
var OSVHD = client.VirtualMachineImages.CreateOSVHD(vmName, vmName, storageAccountName, imageFamiliyName); 
var VMROle = client.VirtualMachines.CreateVMRole(vmName, vmName, VirtualMachineRoleSize.Small, userName, password, OSVHD); 
List<Role> roleList = new List<Role>{ 
VMROle 
}; 
client.VirtualMachines.CreateVMDeployment(vmName, vmName, roleList); 
Console.WriteLine("Create VM success"); 
client.VirtualMachines.AddRole("CloudServiceName", "ExsitDeploymentName", VMROle); 
Console.ReadLine(); 
} 
public static void createCloudServiceByLocation(string cloudServiceName, string location) 
{ 
ComputeManagementClient client = new ComputeManagementClient(getCredentials()); 
HostedServiceCreateParameters hostedServiceCreateParams = new HostedServiceCreateParameters 
{ 
ServiceName = cloudServiceName, 
Location = location, 
Label = EncodeToBase64(cloudServiceName), 
}; 
try 
{ 
client.HostedServices.Create(hostedServiceCreateParams); 
} 
catch (CloudException e) 
{ 
throw e; 
} 
} 
public static void createCloudServiceByAffinityGroup(string cloudServiceName, string affinityGroupName) 
{ 
ComputeManagementClient client = new ComputeManagementClient(getCredentials()); 
HostedServiceCreateParameters hostedServiceCreateParams = new HostedServiceCreateParameters 
{ 
ServiceName = cloudServiceName, 
AffinityGroup = affinityGroupName, 
Label = EncodeToBase64(cloudServiceName), 
}; 
try 
{ 
client.HostedServices.Create(hostedServiceCreateParams); 
} 
catch (CloudException e) 
{ 
throw e; 
} 
} 
public static string EncodeToBase64(string toEncode) 
{ 
byte[] toEncodeAsBytes 
= System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode); 
string returnValue 
= System.Convert.ToBase64String(toEncodeAsBytes); 
return returnValue; 
} 
public static SubscriptionCloudCredentials getCredentials() 
{ 
return new CertificateCloudCredentials(subscriptionId, new X509Certificate2(Convert.FromBase64String(base64EncodedCertificate))); 
} 
}

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

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

相关推荐

发表回复

登录后才能评论