我应该使用哪个VMware API?

我试图用C#编写一个相当简单的应用程序(或者至less我认为它应该很简单),为其所有ESX服务器轮询一个vCenter,然后为每个ESX服务器轮询所有的VM。 它将收集一些简单的实时统计数据并将其放入数据库中。 容易的松懈,对吧? 嗯。

我一直在试图弄清楚我应该使用哪一个VMware API,而且我越来越困惑,越浏览VMware组织严密的文档站点。 我已经阅读了大约60页的“ vSphere Web服务SDK编程指南” ,但仍然不知道如何获取数据(但是我已经了解了一大堆关于VMware的字母汤… yippie)。

因此,我的问题是:我应该使用哪一个VMware API来集中处理CPU,内存,networking和硬盘统计的只读应用程序? 我需要从典型的vCenter +多ESX设置中收集这些数据。

编辑:我忘了提及,我已经成功地写了一个PowerCLI脚本来做我已经解释过的,但是它对生产就绪的产品来说太慢而且不稳定(PowerShell是一种devise不佳的脚本语言)。 我有用于.NETVMware vSphere SDK ,但所提供的文档至less可以说是简短的。 我错过了真正的vSphere SDK for .NET文档吗?

我感到你的痛苦。 我一直在喋喋不休地谈论他们的API有多痛苦,但是我会放过你的。 下面是对我来说合理的工作(我直接连接到ESX盒,但我认为你应该能够build立在这个位置,以达到你想去的地方):

(编辑:格式化固定)

  1. 在这里获取vSphere PowerCLI (以前称为VI Toolkit (for Windows) ); 它包含了VMware.Vim API和接口所需的底层实现类(尽pipe自然,阅读文档后面的内容并不明显)。 把它安装到你的开发机器上(这将把.NET的VMware.Vim实现库放到你的全局程序集caching中;稍后我们将提取我们关心的可移植的库)

  2. 创build一个VS项目,并引入一些hello世界代码。

     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. 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是不够的)。 您可以使用命令行(不是资源pipe理器,它不会工作)将其复制出全局程序集caching。

    从GAC获取VimService DLL:

     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放在同一个文件夹(或path中),您应该有一个体面的基础来构build和部署适用于ESX盒子的代码。