2011-03-30 103 views
35

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

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

因此,我的问题是:我应该将哪个VMware API用于专注于收集CPU,内存,网络和硬盘统计信息的只读应用程序?我需要从典型的vCenter +多ESX设置中收集这些数据。我忘了提及我已经成功地编写了一个PowerCLI脚本来完成我已经解释的内容,但它对于生产就绪的产品来说太慢而且不稳定(并且PowerShell是,imo,a设计不佳的脚本语言)。我的确有VMware vSphere SDK for .NET,但提供的文档至少可以说是简短的。我错过了真正的vSphere SDK for .NET文档吗?

+1

仅供参考下,对于vSphere SDK的API文档是在这里:http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/index.html然而,被漂亮的它经历在.Net中并让其他人开始使用它,我衷心地从下面的答案中推荐Vmware.Vim程序集。唯一需要注意的是,如果您运送软件,它不可再分发。但对于内部自动化的东西来说,这太棒了。 – 2011-04-21 15:42:01

+0

我们要运送产品,感谢上帝它停止了(在我说服他们我们复制了VMware现有的应用程序以及10倍的安全问题之后)。感谢更新。 – 2011-04-26 23:24:50

回答

45

我感到你的痛苦。我一直在喋喋不休地谈论他们的API有多痛苦,但我会放过你。以下是运作相当良好,对我(我是直接连接到ESX箱,但我认为你应该能够建立在这得到你想要去的):

(编辑:格式化固定)

  1. 抓住vSphere PowerCLIhere(以前称为VI Toolkit (for Windows));它包括VMware.Vim API和接口所需的底层实现类(尽管自然,阅读文档后者并不明显)。将它安装到您的开发机器上(这会将.NET VMware.Vim实现库放入您的全局程序集缓存中;稍后我们将提取我们关心的可移植库)

  2. 创建一个VS项目,你好世界代码。

    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是不够的)。您可以使用命令行(不是资源管理器,它不会工作)将它们从全局程序集缓存中复制出来。

    从海关总署获得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盒一起使用的代码。

+2

很好的答案,谢谢!实际上,我使用VMware.Vim编写了一个测试程序,现在我知道我需要的东西,我会进一步探索它。值得一提的是,这种营利性的骗局是我为什么坚持开源解决方案的原因...... – 2011-03-31 00:19:02

+0

感谢Lot @ coffeetocode。你的回答帮了我很多。干杯..... – 2013-09-12 05:32:38

+0

很久以前我已经写了很多关于这个话题的,可能它仍然有用?! https://communities.vmware.com/message/1806388?tstart=0#1806388 – Kjellski 2014-07-17 13:55:26