web-dev-qa-db-ja.com

どのVMware APIを使用すればよいですか?

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

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

したがって、私の質問は次のとおりです。CPU、メモリ、ネットワーク、およびハードドライブの統計情報の収集に重点を置いた読み取り専用アプリケーションには、どのVMware APIを使用すればよいですか。一般的なvCenter +マルチESX設定からこのデータを収集する必要があります。

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

38
The Maniac

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

(編集:書式設定を修正)

  1. _vSphere PowerCLI_ here (以前はVI Toolkit (for Windows)と呼ばれていました)を取得します。これには、VMware.Vim APIと、インターフェースが遅延する必要な基本的な実装クラスが含まれます(当然、後者はドキュメントを読んでも明らかではありません)。 devマシンにインストールします(これにより、.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では不十分です)。コマンドライン(エクスプローラーではなく、機能しません)を使用して、グローバルアセンブリキャッシュからそれらをコピーできます。

    VimService DLL GACから取得:

    _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ボックスで機能するコードをビルドおよびデプロイするための適切な基盤が必要です。

47
coffeetocode