Какой API VMware следует использовать?

Я пытаюсь написать довольно простое приложение на C# (или, по крайней мере, я думаю, что оно должно быть простым), которое опрашивает vCenter для всех своих серверов ESX, а затем каждый сервер ESX для всех своих виртуальных машин. Он соберет простую статистику в режиме реального времени и занесет ее в базу данных. Легко, не так ли? Хм.

Я застрял, пытаясь понять, какой API VMware мне следует использовать, и чем больше я просматриваю ужасно организованный сайт документации VMware, тем больше запутываюсь. Я прочитал около 60 страниц Руководства по программированию vSphere Web Services SDK и до сих пор не знаю, как получать данные (но я многое узнал об алфавите VMware). суп... юппи).

Таким образом, у меня возникает вопрос: какой API VMware мне следует использовать для приложения только для чтения, ориентированного на сбор статистики ЦП, памяти, сети и жесткого диска? Мне нужно собрать эти данные из типичной установки vCenter + несколько ESX.

Редактировать: я забыл упомянуть, что я успешно написал сценарий PowerCLI для выполнения того, что я объяснил, но он слишком медленный и нестабильный для готового к производству продукта (и PowerShell, имхо, плохо спроектированный язык сценариев). У меня есть VMware vSphere SDK для .NET, но предоставленная документация... по меньшей мере краткая. Я пропустил настоящую документацию vSphere SDK для .NET?


person The Maniac    schedule 30.03.2011    source источник
comment
К сведению, документ API для vSphere SDK находится здесь: vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/ Однако, имея большой опыт работы с .Net и помогая другим начать работу с ним, я искренне рекомендую сборку Vmware.Vim из ответа ниже. Единственное предостережение заключается в том, что он не подлежит повторному распространению, если вы отправляете программное обеспечение. Но для внутренней автоматизации это здорово.   -  person Evan Powell    schedule 21.04.2011
comment
Мы собирались поставлять продукт, но, слава богу, он был снят с производства (после того, как я убедил их, что мы дублируем существующие приложения VMware с 10-кратным увеличением проблем с безопасностью). Спасибо за обновления.   -  person The Maniac    schedule 27.04.2011


Ответы (1)


Я чувствую твою боль. Я сижу в длинном разглагольствовании о том, насколько болезненны их API, но я вас пощажу. Вот что сработало у меня довольно хорошо (я подключаюсь напрямую к ESX-боксам, но я думаю, что вы должны использовать это, чтобы добраться туда, куда вы хотите):

(Изменить: исправлено форматирование)

  1. Возьмите vSphere PowerCLI здесь (ранее назывался VI Toolkit (for Windows)); он включает API VMware.Vim и необходимые базовые классы реализации, от которых зависит интерфейс (хотя, естественно, последнее не очевидно из чтения документации). Установите его на свой компьютер разработчика (это поместит библиотеки реализации .NET VMware.Vim в ваш глобальный кэш сборок; позже мы извлечем библиотеки, которые нам нужны для переносимости)

  2. Создайте проект VS и добавьте какой-нибудь код hello world.

    using VMware.Vim;
    
    //some namespace, some class, some method...
    
    VimClient c = new VimClient();
    ServiceContent sc = c.Connect("hostnameOrIpHere");
    UserSession us = c.Login("usernameHere", "passwordHere");
    
    IList<VMware.Vim.EntityViewBase> vms = c.FindEntityViews(typeof(VMware.Vim.VirtualMachine), null, null, null);
    foreach (VMware.Vim.EntityViewBase tmp in vms)
    {
        VMware.Vim.VirtualMachine vm = (VMware.Vim.VirtualMachine)tmp;
        Console.WriteLine((bool)(vm.Guest.GuestState.Equals("running") ? true : false));
        Console.WriteLine(new Uri(ENDPOINTURL_PREFIX + (vm.Guest.IpAddress != null ? vm.Guest.IpAddress : "0.0.0.0") + ENDPOINTURL_SUFFIX));
        Console.WriteLine((string)vm.Client.ServiceUrl);
        Console.WriteLine(vm.Guest.HostName != null ? (string)vm.Guest.HostName : "");
        Console.WriteLine("----------------");        
    

    }

  3. Если это сработает и распечатает некоторую информацию о ваших виртуальных машинах, то пока все хорошо. Если вы видите что-то вроде System.IO.FileNotFoundException: Could not load file or assembly 'VimService40, Version=4.0.0.0, Culture=neutral, Public KeyToken=10980b081e887e9f' or one of its dependencies. The system cannot find the file specified., значит, у вас не установлены фактические файлы реализации: VMware.Vim.dll — это просто интерфейс, а фактические реализации для каждого протокола находятся в таких файлах, как VimService40.dll, которые вы должны были получить с помощью шаг 1.

  4. Как только вы захотите где-нибудь развернуть этот код, вам придется отправить вместе с ним DLL-библиотеки фактической реализации (опять же, VMware.vim.dll недостаточно). Вы можете использовать командную строку (не проводник, это не сработает), чтобы скопировать их из глобального кэша сборок.

    Получите DLL VimService из GAC:

    cd %windir%\assembly\GAC_MSIL
    cp VimService20\2.0.0.0__10980b081e887e9f\VimService20.dll %HOMEDRIVE%\%HOMEPATH%\Desktop
    cp VimService20.XmlSerializers\2.0.0.0__10980b081e887e9f\VimService20.XmlSerializers.dll %HOMEDRIVE%\%HOMEPATH%
    cp VimService25\2.5.0.0__10980b081e887e9f\VimService20.dll %HOMEDRIVE%\%HOMEPATH%\Desktop
    cp VimService25.XmlSerializers\2.5.0.0__10980b081e887e9f\VimService20.XmlSerializers.dll %HOMEDRIVE%\%HOMEPATH%
    ... etc, for all the VimService versions you might use ...
    
  5. Когда вы развертываете свой код на другом компьютере, поместите эти библиотеки DLL в ту же папку (или по пути), и у вас должна быть достойная основа для создания и развертывания кода, который работает с ящиками ESX.

person coffeetocode    schedule 31.03.2011
comment
Отличный ответ, спасибо! На самом деле я написал тестовую программу с использованием VMware.Vim, и теперь, когда я знаю, что мне нужно, я буду исследовать ее дальше. Кстати, из-за такой коммерческой хрени я обычно придерживаюсь решений с открытым исходным кодом... - person The Maniac; 31.03.2011
comment
Большое спасибо @coffeetocode. Ваш ответ мне очень помог. ваше здоровье ..... - person Anshuman Jasrotia; 12.09.2013
comment
Давно много писал на эту тему, может еще пригодится?! communities.vmware.com/message/1806388?tstart=0#1806388 - person Kjellski; 17.07.2014
comment
Обратите внимание, что для PowerCLI Release 6 требуется .Net 4.5. Версия 5.8 — последняя версия, поддерживающая .Net 2 и .Net 3.5. - person David; 11.09.2015
comment
У вас есть идеи, работает ли это с vSphere 6.5? У меня такое ощущение, что это не так - есть новый API (на основе REST), который, по-видимому, использует vmware.vim25; Я в замешательстве - любая помощь? - person Nils; 04.08.2017
comment
@Nils: мне пришлось использовать такой URL-адрес vcenterservername:443/sdk/vimService, и код работал для меня с vSphere 6.5 - person frank koch; 09.04.2018