首页 > 解决方案 > 使用 PowerCLI .net C# 重新启动 VM

问题描述

我一直在用这个撞墙。目标是使用 PowerCLI 的 API 和 C# 重新启动 VM。这将是一个 MVC 框架。用户登录并在登录页面上获得要重新启动的服务器列表。选择服务器,并重新启动其中的一个或多个(复选框)。

我的问题是理解 PowerCLI,以及我需要什么。目前,我引用了 VMware.Vim,它可以让我连接,获取服务器列表。但是,我不确定如何通过 API 重新启动服务器。以下是我安装的库。我不确定除了 VMware.Vim 之外我还需要什么来实现这一点。

https://code.vmware.com/web/tool/12.0.0/vmware-powercli

我目前正在使用这个 youtube 视频作为起点。但是,我们将不胜感激任何文档、代码示例或任何指导。这有点超出我的水平,我完全不熟悉 PowerCLI。

更多文档。

非常感谢您的宝贵时间,

PowerCLINooby

标签: c#.netmodel-view-controllervmwarepowercli

解决方案


这是我在 .net 中用于重新启动 VM 的代码。您需要的唯一库是VMware.Vim.

  1. 首先,获取连接到您的 vCenter 的客户端
public static VimClient ConnectToVCenter(string vCenterUrl, string username, string password)
{
    ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);

    VimClient client = new VimClientImpl();
    try
    {
        client.Connect($"https://{vCenterUrl}/sdk");
    }
    catch (Exception ex)
    {
        throw new ApplicationException($"Unable to connect to [{vCenterUrl}]. Exception: [{ex.Message}]");
    }
    client.Login(username, password);
    return client;
}
  1. 获取虚拟机
public static VirtualMachine GetVM(VimClient client, string guestVM, ManagedObjectReference parentMoRef = null)
{
    // Lookup VM in vCenter.
    NameValueCollection Filter = new NameValueCollection
    {
        { "name", guestVM }
    };

    List<VirtualMachine> virtualMachines = GetEntities<VirtualMachine>(client, parentMoRef, Filter, null);

    // Do some error checking to make sure your VM was found.
    return virtualMachines.FirstOrDefault();
}

// Helper function that can be used to look up various objects like VirtualMachine, Datastore, etc.
public static List<T> GetEntities<T>(VimClient vimClient, ManagedObjectReference beginEntity, NameValueCollection filter, string[] properties)
{
    return vimClient.FindEntityViews(typeof(T), beginEntity, filter, properties)?.Cast<T>().ToList();
}
  1. 启动或关闭或重新启动 VM
// Use enum for power operations
public enum PowerOp
{
    suspend,
    reset,
    powerOff,
    gracefulOff,
    powerOn,
    powerOnWaitForTools,
    gracefulReboot,
    standby
}

public static void PowerOperation(VimClient client, VirtualMachine vm, PowerOp operation)
{
    switch (operation)
    {
        case PowerOp.suspend:
            if (vm.Runtime.PowerState != VirtualMachinePowerState.suspended)
                client.WaitForTask(vm.SuspendVM_Task());
            break;

        case PowerOp.reset:
            client.WaitForTask(vm.ResetVM_Task());
            break;

        case PowerOp.powerOff:
            if (vm.Runtime.PowerState != VirtualMachinePowerState.poweredOff)
            {
                client.WaitForTask(vm.PowerOffVM_Task());
            }
            break;

        case PowerOp.powerOn:
            if (vm.Runtime.PowerState != VirtualMachinePowerState.poweredOn)
            {
                client.WaitForTask(vm.PowerOnVM_Task(vm.Runtime.Host));
            }
            break;

        case PowerOp.powerOnWaitForTools:
            if (vm.Runtime.PowerState != VirtualMachinePowerState.poweredOn)
            {
                client.WaitForTask(vm.PowerOnVM_Task(vm.Runtime.Host));
            }
            vm.WaitForTools(client);
            break;

        case PowerOp.gracefulReboot:
            vm.RebootGuest();
            Thread.Sleep(10000); // Wait at least 10 seconds to let the server start with reboot.
            vm.WaitForTools(client);
            Thread.Sleep(5000); // Just a precaution.
            break;

        case PowerOp.gracefulOff:
            if (vm.Runtime.PowerState != VirtualMachinePowerState.poweredOff)
                vm.ShutdownGuest();
            vm.WaitForPowerState(client, VirtualMachinePowerState.poweredOff);
            break;

        case PowerOp.standby:
            vm.StandbyGuest();
            break;

        default:
            throw new ApplicationException($"Error: Unknown power operation requested");
    }
}

推荐阅读