39

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

我一直在试图弄清楚我应该使用哪个 VMware API,而且我越是浏览 VMware 组织得非常严密的文档站点,我就越感到困惑。我已经阅读了大约 60 页的vSphere Web Services SDK Programmin Guide,但仍然不知道如何获取数据(但我学到了很多关于 VMware 的字母汤... yippie)。

因此,我的问题是:对于专注于收集 CPU、内存、网络和硬盘驱动器统计信息的只读应用程序,我应该使用哪个 VMware API?我需要从典型的 vCenter + 多 ESX 设置中收集这些数据。

编辑:我忘了提到我已经成功地编写了一个 PowerCLI 脚本来完成我所解释的工作,但是对于生产就绪的产品来说它太慢且不稳定(而且 PowerShell 是,imo,一种设计不佳的脚本语言)。我确实有适用于 .NET 的 VMware vSphere SDK,但提供的文档是……至少可以说很简短。我错过了真正的 vSphere SDK for .NET 文档吗?

4

1 回答 1

49

我感觉到你的痛苦。我对他们的 API 有多么痛苦进行了更长的咆哮,但我会饶过你。这对我来说效果很好(我直接连接到 ESX 盒子,但我认为你应该能够在此基础上实现你想去的地方):

(编辑:格式固定)

  1. 抓住vSphere PowerCLI 这里(以前称为VI Toolkit (for Windows));它包括 VMware.Vim API 和接口所遵循的所需的底层实现类(当然,后者在阅读文档时并不明显)。将它安装在您的开发机器上(这会将 .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 之类的文件中,您应该通过 step 获得1.

  4. 一旦您想在某处部署此代码,您必须随其发送实际的实现 dll(同样,VMware.vim.dll 还不够)。您可以使用命令行(不是资源管理器,它不起作用)将它们从全局程序集缓存中复制出来。

    从 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 放在同一个文件夹(或路径上),您应该有一个良好的基础来构建和部署与 ESX 框一起使用的代码。

于 2011-03-31T00:15:24.187 回答