【问题标题】:Which VMware API should I use? [closed]我应该使用哪个 VMware API? [关闭]
【发布时间】:2011-07-26 12:11:03
【问题描述】:

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

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

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

编辑:我忘了提到我已经成功编写了一个 PowerCLI 脚本来执行我所解释的操作,但是对于生产就绪产品(而 PowerShell 是,imo,一种设计不佳的脚本语言)。我确实有 VMware vSphere SDK for .NET,但提供的文档是……至少可以说很简短。我是否缺少真正的 vSphere SDK for .NET 文档?

【问题讨论】:

  • 仅供参考,vSphere SDK 的 API 文档在这里:vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/… 但是,我在 .Net 中对它非常有经验并让其他人开始使用它,我衷心推荐来自下面回答。唯一需要注意的是,如果您要发布软件,它是不可再分发的。但是对于内部自动化的东西,它很棒。
  • 我们正准备发布该产品,谢天谢地,它已经停产(在我说服他们我们正在复制 VMware 的现有应用程序之后,存在 10 倍的安全问题)。感谢您的更新。

标签: c# vmware esx powercli


【解决方案1】:

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

(编辑:格式固定)

  1. 获取vSphere PowerCLIhere(以前称为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 框的代码。

【讨论】:

  • 很好的答案,谢谢!我实际上已经使用 VMware.Vim 编写了一个测试程序,现在我知道我需要它,我将进一步探索它。旁注,这种营利性的破坏是我通常坚持开源解决方案的原因......
  • 非常感谢@coffeetocode。你的回答对我帮助很大。干杯.....
  • 我很久以前写过很多关于这个话题的文章,也许它仍然有用?! communities.vmware.com/message/1806388?tstart=0#1806388
  • 请注意,“PowerCLI Release 6”需要 .Net 4.5。 “Release 5.8”是支持 .Net 2 和 .Net 3.5 的最后一个版本
  • 你们知道这是否仍然适用于 vSphere 6.5 吗?我感觉它没有——有一个新的 api(基于 REST),它显然使用了 vmware.vim25;我很困惑 - 有什么帮助吗?
猜你喜欢
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 2011-03-13
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多