使用c#更改Azure VM角色大小

时间:2015-02-16 15:57:57

标签: c# powershell azure

我尝试使用C#Management API(Microsoft.WindowsAzure.Management.Compute)复制一些PowerShell代码来更改现有Azure VM的角色大小。

这就是我想要完成的事情:

Get-AzureVM | Where-Object {$_.InstanceSize -ne 'Basic_A0'} | Set-AzureVMSize "Basic_A0" | Update-AzureVM
到目前为止,我的C#代码尝试降级特定虚拟机,但每当我尝试更新虚拟机设置时,我都会得到一个我不太了解的异常,因为PowerShell版本不需要安装ProvisionGuestAgent VM可以更改角色大小。

  

未处理的类型' Microsoft.WindowsAzure.CloudException'   发生在Microsoft.Threading.Tasks.dll

     

其他信息:BadRequest:为了使用扩展名   参考,必须在虚拟机中设置ProvisionGuestAgent   供应

public void DowngradeVm(ComputeManagementClient Client, string VmName) {
  var hostedServices = Client.HostedServices.List();
  foreach (var service in hostedServices) {
    if (service.ServiceName != VmName) { continue;  }
    var deployment = Client.Deployments.GetBySlot(service.ServiceName, DeploymentSlot.Production);
    if (deployment != null) {
      if (deployment.Roles.Count > 0) {
        foreach (var role in deployment.Roles) {
          if (role.RoleType == VirtualMachineRoleType.PersistentVMRole.ToString()) {
            if (role.RoleSize != "Basic_A0") {
              // attempt do downgrade VM
              var upd = new VirtualMachineUpdateParameters();
              upd.AvailabilitySetName = role.AvailabilitySetName;
              upd.ConfigurationSets = role.ConfigurationSets;
              upd.DataVirtualHardDisks = role.DataVirtualHardDisks;
              upd.Label = role.Label;
              upd.OSVirtualHardDisk = role.OSVirtualHardDisk;
              upd.ProvisionGuestAgent = role.ProvisionGuestAgent;
              upd.ResourceExtensionReferences = role.ResourceExtensionReferences;
              upd.RoleName = role.RoleName;
              upd.RoleSize = "Basic_A0";
              // Service, Deployment and VM have the same name
              // the next line throws an exception
              Client.VirtualMachines.Update(VmName, VmName, VmName, upd);
            }
          }
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

我找到了解决方案:role.ProvisionGuestAgent为null(可能是因为该角色不在线),但需要为更新生效。

          upd.ProvisionGuestAgent = true;