如何使用C#和Azure .Net SDK在Azure中克隆和管理虚拟机?

我遵循了有关如何使用C#管理虚拟机的指南,并可以基于它创建示例程序。

但是,我还有一个用例,我们想要克隆多个虚拟机并使用C#编写的控制台程序远程管理它们。 我可以找到通过电源shell 克隆虚拟机的方法,但我找不到任何地方如何创建克隆并最终管理Azure上的克隆虚拟机。

任何人都可以给我一个方向,如何使用.Net SDK来实现这个用例?

谢谢

我们可以使用Microsoft.Azure.Management.Fluent和WindowsAzure.Storage来实现 。

我为它创建了一个演示,它对我来说正常。 以下是我的详细步骤。

正如你提到的链接 。 首先,我们需要释放VM。 在此之前,我们需要对Azure中的操作资源进行身份validation。

1.使用身份validation文件获取Azure对象,如何创建身份validation文件请参阅文档 。 在此之前,我们需要注册Azure AD应用程序并为其分配相应的角色,更多详细信息请参阅该文档 。 然后我们可以从Azure AD App获取clientId,密钥(密钥)和租户。 文件格式如下

subscription=########-####-####-####-############ client=########-####-####-####-############ key=XXXXXXXXXXXXXXXX tenant=########-####-####-####-############ managementURI=https\://management.core.windows.net/ baseURL=https\://management.azure.com/ authURL=https\://login.windows.net/ graphURL=https\://graph.windows.net/ 

创建Microsoft.Azure.Management.Fluent.Azure对象

  var credentials = SdkContext.AzureCredentialsFactory.FromFile(@"path of authentication file"); var azure = Azure .Configure() .WithLogLevel(HttpLoggingDelegatingHandler.Level.BASIC) .Authenticate(credentials) .WithDefaultSubscription() 

2.使用C#代码取消分配VM。

 azure.VirtualMachines.PowerOff(resourcegroup,vmName); //shutdown the VM azure.VirtualMachines.Deallocate(resourcegroup, vmName); //deallocate the VM 

3.使用代码获取VM Disk Vhd uri Info

  var vm = azure.VirtualMachines.GetByGroup(resourcegroup, vmName); string vhdUri= vm.StorageProfile.OsDisk.Vhd.Uri; //result : https://storageaccountname.blob.core.windows.net/vhds/blob.vhd 

4.从vhduri然后我们可以获得存储帐户blobname

5.开始将blob复制到目标容器,有关操作blob的更多详细信息,请参阅该文档。

  var account = azure.StorageAccounts.GetByGroup(resourcegroup,storageaccount); var key = account.GetKeys()[0]; CloudStorageAccount storageAccount = CloudStorageAccount.Parse("connectionstring"); // Create a CloudFileClient object for credentialed access to File storage. CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); CloudBlobContainer container = blobClient.GetContainerReference("tomvhds"); CloudBlobContainer sourceBlobContainer = blobClient.GetContainerReference("vhds"); container.CreateIfNotExists(); CloudPageBlob destBlob = container.GetPageBlobReference(destinationBlob); CloudPageBlob sourcePageBlob = sourceBlobContainer.GetPageBlobReference(sourceblob); destBlob.StartCopy(sourcePageBlob); copyVhdurl = destBlob.Uri.ToString(); 

6.创建磁盘以创建vm

  var disk = azure.Disks.Define("diskname") .WithRegion(location) .WithExistingResourceGroup(resourcegroup) .WithWindowsFromVhd(copyvhduri) .Create(); 

7.创建VM并从Azure门户进行检查

  var windowsVm = azure.VirtualMachines.Define(machinename) .WithRegion(location) //eastasia .WithNewResourceGroup(resourcegroupName) .WithNewPrimaryNetwork("10.0.0.0/28") .WithPrimaryPrivateIpAddressDynamic() .WithNewPrimaryPublicIpAddress("dnslab") .WithSpecializedOsDisk(disk, OperatingSystemTypes.Windows) .WithSize(VirtualMachineSizeTypes.StandardA0) .Create(); 

在此处输入图像描述

在此处输入图像描述

packages.config文件