我应该使用哪个VMware API? [关闭]

问题描述 投票:36回答:1

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

我一直在努力弄清楚我应该使用哪个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文档吗?

c# vmware esx powercli
1个回答
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机器的代码。
© www.soinside.com 2019 - 2024. All rights reserved.