Перезапустите виртуальные машины с PowerCLI. net C# - PullRequest
0 голосов
/ 25 апреля 2020

Я врезался в стену с этим. Цель состоит в том, чтобы перезапустить виртуальные машины, использующие API PowerCLI с C#. Это будет MVC framework. Пользователь входит в систему и на целевой странице предоставляется список серверов для перезапуска. Выбирает сервер и перезапускает один или несколько из них (флажок).

Моя проблема - понимание PowerCLI и то, что мне нужно. В настоящее время у меня есть ссылка на VMware.Vim, и это может позволить мне подключиться, получить список серверов. Тем не менее, я не уверен, как перезагрузить сервер через API. Ниже приведены библиотеки, которые я установил. Я не уверен, что еще мне нужно, кроме VMware.Vim для достижения этой цели.

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

В настоящее время я использую это видео на YouTube в качестве , начиная пункт . Тем не менее, любая документация, примеры кода или любые рекомендации будут с благодарностью. Это немного выше моего уровня, и я совершенно незнаком с PowerCLI.

Дополнительная документация.

Большое спасибо за потраченное время,

PowerCLINooby

1 Ответ

0 голосов
/ 03 мая 2020

Это код, который я использую. net для перезапуска виртуальных машин. Вам нужна только библиотека 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;
}
Получить ВМ
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();
}
Включите или выключите или перезагрузите виртуальную машину
// 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");
    }
}
...