如何使用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文件