web-dev-qa-db-fra.com

Quelle API VMware dois-je utiliser?

J'essaie d'écrire une application assez simple en C # (ou du moins, je pense que cela devrait être simple) qui interroge un vCenter pour tous ses serveurs ESX, puis chaque serveur ESX pour toutes ses machines virtuelles. Il collectera des statistiques simples et en temps réel et les placera dans une base de données. Peasy facile, non? Hmm.

Je suis coincé à essayer de comprendre quelle API VMware je devrais utiliser et je deviens de plus en plus confus lorsque je navigue sur le site de documentation terriblement organisé de VMware. J'ai lu environ 60 pages du Guide de programmation SDK de vSphere Web Services et je ne sais toujours pas comment pour obtenir des données (mais j'ai beaucoup appris sur la soupe à l'alphabet de VMware ... yippie).

Ma question est donc la suivante: quelle API VMware dois-je utiliser pour une application en lecture seule axée sur la collecte de statistiques sur le processeur, la mémoire, le réseau et le disque dur? J'ai besoin de rassembler ces données à partir d'une configuration vCenter + multiple-ESX typique.

Edit: J'ai oublié de mentionner que j'ai réussi à écrire un script PowerCLI pour faire ce que j'ai expliqué, mais c'est juste trop lent et instable pour un produit prêt pour la production (et PowerShell est, imo, un langage de script mal conçu). J'ai le SDK VMware vSphere pour .NET , mais la documentation fournie est ... brève pour dire le moins. Suis-je absent du vrai SDK vSphere pour les documents .NET?

38
The Maniac

Je ressens ta douleur. Je m'assieds plus longuement sur la douleur de leurs API, mais je vous épargne. Voici ce qui a fonctionné assez bien pour moi (je me connecte directement aux boîtiers ESX, mais je pense que vous devriez pouvoir en tirer parti pour arriver là où vous voulez aller):

(Modifier: mise en forme fixe)

  1. Prenez le vSphere PowerCLIici (précédemment appelé VI Toolkit (for Windows)); il comprend l'API VMware.Vim et les classes d'implémentation sous-jacentes requises auxquelles l'interface diffère (bien que naturellement, la dernière ne soit pas évidente à la lecture des documents). Installez-le sur votre machine de développement (cela place les bibliothèques d'implémentation .NET VMware.Vim dans votre Global Assembly Cache; nous extrairons plus tard les bibliothèques dont nous nous soucions pour la portabilité)

  2. Créez un projet VS et ajoutez du bon code mondial.

    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. Si cela fonctionne et affiche des informations sur vos machines virtuelles, jusqu'à présent, tout va bien. Si vous voyez quelque chose comme 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., Alors vous savez que vous n'avez pas installé les fichiers d'implémentation réels: VMware.Vim.dll n'est que l'interface et les implémentations réelles par protocole se trouvent dans des fichiers comme VimService40.dll qui vous auriez dû passer à l'étape 1.

  4. Une fois que vous voulez déployer ce code quelque part, vous devez envoyer les DLL d'implémentation réelles avec lui (encore une fois, VMware.vim.dll n'est pas suffisant). Vous pouvez utiliser la ligne de commande (pas Explorer, cela ne fonctionnera pas) pour les copier hors du Global Assembly Cache.

    Obtenez VimService DLL de 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. Lorsque vous déployez votre code sur une autre machine, placez ces DLL dans le même dossier (ou sur le chemin d'accès) et vous devriez avoir une base décente pour créer et déployer du code qui fonctionne avec les boîtes ESX.

47
coffeetocode