首页 > 解决方案 > 使用 C# 和 StorageManagementClient/ComputeManagementClient 将 Azure 磁盘附加到 VM

问题描述

我已经有一个可以正常工作的 C# ResourceManager 应用程序,它可以成功地将磁盘附加到虚拟机。但是我用 nuget 包解决了这个问题Microsoft.Azure.Management.Compute。但是,由于这个包在其他开发中引起了问题,所以决定不再使用它。为此,我们正在使用Microsoft.Azure.Management.Compute.Fluent.

到目前为止,我有以下代码(短版):

var computeClient = new ComputeManagementClient(credentials) {
      SubscriptionId = credentials.DefaultSubscriptionId };

var ObjVirtualMachines = computeClient.VirtualMachines.Get(resourcegroup, vmname);

ObjVirtualMachines.StorageProfile.DataDisks.Add(
      new DataDisk(ObjVirtualMachines.StorageProfile.DataDisks.Count + 1,
                   "Attach", name, null, null, null, null, null,
                   new ManagedDiskParameters(resourceid, acctype)));

var newUpdatesVM = computeClient.VirtualMachines.CreateOrUpdate(
      resourcegroup, ObjVirtualMachines.Name, ObjVirtualMachines);

这非常有效,但正如我所说,我必须翻译到另一个包。

首先,我认为我可以使用StorageManagementClient.

但是由于参数的类型不匹配,我没有得到任何更新虚拟机的选项。

有任何想法吗?

标签: c#azureazure-virtual-machine

解决方案


好的,这就是答案...

var ObjVirtualMachines = computeClient.VirtualMachines.GetAsync(ressgroup, virtualmname, null, new System.Threading.CancellationToken()).Result;
var storagemanagementclient = new StorageManagementClient(credentials) { SubscriptionId = credentials.DefaultSubscriptionId };

ObjVirtualMachines.StorageProfile.DataDisks.Add(new DataDisk(
ObjVirtualMachines.StorageProfile.DataDisks.Count + 1,
DiskCreateOptionTypes.Attach,
name,
null,
null,
null,
null,
new ManagedDiskParametersInner(resourceid, acctype)));

var newUpdateVM = computeClient.VirtualMachines.CreateOrUpdateAsync(ressgroup, virtualmname, ObjVirtualMachines);

对于 acctype 使用这个。

 var computeClient = new ComputeManagementClient(credentials) { SubscriptionId = credentials.DefaultSubscriptionId };
 var disk = computeClient.Disks.ListAsync().Result.FirstOrDefault(p => p.Name == name);
 var content = azure.Disks.GetById(disk.Id);
 var resourceid = disk.Id;
 var ressgroup = Resourcegroup.Get(context);
 var virtualmname = VirtualMachineName.Get(context);
 var acctype = getAccType(content.Sku.AccountType.ToString());

getAccType 函数是这个...

 public StorageAccountTypes getAccType(string input)
    {
        switch (input)
        {
            case "StandardLRS": return StorageAccountTypes.StandardLRS;
            case "PremiumLRS": return StorageAccountTypes.PremiumLRS;
            //    case "StandardSSDLRS":return "StandardSSD_LRS";
            //    case "UltraSSDLRS":return "UltraSSD_LRS";
            default: return StorageAccountTypes.StandardLRS;

        }
    }

问题是此命名空间中的 AccType 版本限制为 2 (StandardLRS 和 PremiumLRS)。在旧版本中,您有 4 个不同的版本。


推荐阅读