我应该使用哪个VMware API?

时间:2011-03-30 23:30:49

标签: c# vmware esx powercli

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

我一直在努力弄清楚我应该使用哪种VMware API,而且我越来越困惑,我越是浏览VMware组织严密的文档网站。我已经阅读了大约60页的 vSphere Web Services SDK Programmin指南,但仍然不知道如何获取数据(但我对VMware的字母表了解不少汤... yippie)。

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

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

1 个答案:

答案 0 :(得分:47)

我感觉到你的痛苦。我对他们的API有多痛苦感到惋惜,但我会饶了你。这对我来说效果相当好(我直接连接到ESX盒子,但我认为你应该能够在此基础上建立你想去的地方):

(编辑:格式固定)

  1. 抓住vSphere PowerCLI here(之前称为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. 如果可行并打印出有关您的VM的一些信息,那么到目前为止,那么好。如果您看到类似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是不够的)。您可以使用命令行(不是资源管理器,它将无法工作)将它们复制出全局程序集缓存。

    从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盒的代码。