39

すべてのESXサーバーについてvCenterをポーリングし、次にすべてのVMについて各ESXサーバーをポーリングする、かなり単純なアプリケーションをC#で作成しようとしています(少なくとも、単純なはずです)。それはいくつかの単純なリアルタイムの統計を収集し、データベースにそれらを配置します。簡単ですよね?うーん。

どのVMwareAPIを使用すべきかを理解しようとして立ち往生しており、VMwareのひどく整理されたドキュメントサイトを閲覧するほど混乱します。vSphere Web Services SDK Programminガイドの約60ページを読みましたが、データの取得方法がわかりません(ただし、VMwareのアルファベットスープについて多くのことを学びました... yippie)。

したがって、私の質問は、CPU、メモリ、ネットワーク、およびハードドライブの統計の収集に焦点を当てた読み取り専用アプリケーションにどのVMwareAPIを使用する必要があるかということです。このデータは、一般的なvCenter+複数のESXセットアップから収集する必要があります。

編集:説明したことを実行するためのPowerCLIスクリプトを正常に作成したことを忘れましたが、本番環境に対応した製品には遅すぎて不安定です(PowerShellは、設計が不十分なスクリプト言語です)。VMware vSphere SDK for .NETを持っていますが、提供されているドキュメントは...控えめに言っても簡単です。実際のvSphereSDKfor .NETドキュメントがありませんか?

4

1 に答える 1

49

あなたの痛みが分かります。私は彼らのAPIがどれほど苦痛であるかについて、より長い怒りに座っていますが、私はあなたを惜しまないでしょう。これが私にとってかなりうまくいったことです(私はESXボックスに直接接続していますが、これに基づいて目的の場所に到達できるはずです):

(編集:フォーマットが修正されました)

  1. ここをつかみvSphere PowerCLI ます(以前は呼ばれていましたVI Toolkit (for Windows)); これには、VMware.Vim APIと、インターフェイスが延期する必要な基盤となる実装クラスが含まれています(ただし、当然のことながら、後者はドキュメントを読んでも明らかではありません)。開発マシンにインストールします(これにより、.NET VMware.Vim実装ライブラリがグローバルアセンブリキャッシュに配置されます。移植性のために関心のあるライブラリは後で抽出します)

  2. VSプロジェクトを作成し、HelloWorldコードを投入します。

    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.1。

  4. このコードをどこかにデプロイしたい場合は、実際の実装dllを一緒に送信する必要があります(ここでも、VMware.vim.dllでは不十分です)。コマンドライン(エクスプローラーではなく、機能しません)を使用して、グローバルアセンブリキャッシュからそれらをコピーできます。

    GACからVimServiceDLLを取得します。

    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 に答える