38 votes

Quelle API VMware dois-je utiliser ?

J'essaie d'écrire une application assez simple en C# (ou du moins, je pense qu'elle devrait être simple) qui interroge un vCenter pour tous ses serveurs ESX, puis chaque serveur ESX pour toutes ses VM. Elle collectera quelques statistiques simples en temps réel et les placera dans une base de données. Simple comme bonjour, non ? Hmm.

J'essaie de déterminer quelle API VMware je dois utiliser et je m'embrouille de plus en plus en parcourant le site de documentation terriblement bien organisé de VMware. J'ai lu environ 60 pages de la documentation de l Guide du programme vSphere Web Services SDK et je n'ai toujours aucune idée comment pour obtenir des données (mais j'ai appris une tonne de choses sur la soupe alphabétique 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 typique de vCenter + plusieurs ESX.

Edit : J'ai oublié de mentionner que j'ai réussi à écrire un script PowerCLI pour faire ce que j'ai expliqué, mais il est tout simplement trop lent et instable pour un produit prêt à être mis en production (et PowerShell est, à mon avis, un langage de script mal conçu). J'ai bien le SDK VMware vSphere pour .NET mais la documentation fournie est... brève, c'est le moins qu'on puisse dire. Est-ce que je rate la vraie documentation de vSphere SDK pour .NET ?

1 votes

Pour info, la doc API pour le vSphere SDK est ici : vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/ Cependant, étant donné que j'ai beaucoup d'expérience dans ce domaine en .Net et que j'ai aidé d'autres personnes à s'y mettre, je recommande vivement l'assemblage Vmware.Vim de la réponse ci-dessous. La seule réserve est qu'il n'est pas redistribuable si vous expédiez un logiciel. Mais pour l'automatisation interne, c'est génial.

0 votes

Nous allions expédier le produit, Dieu merci il a été abandonné (après que je les ai convaincus que nous dupliquions les applications existantes de VMware, avec 10x plus de problèmes de sécurité). Merci pour la mise à jour.

49voto

coffeetocode Points 855

Je ressens votre douleur. Je suis assis sur une plus longue diatribe sur la façon dont leurs APIs sont douloureuses, mais je vais vous épargner. Voici ce qui a raisonnablement bien fonctionné pour moi (je me connecte directement aux boîtes ESX, mais je pense que vous devriez être en mesure de vous baser sur cela pour arriver là où vous voulez aller) :

(Edit : Formatting fixed)

  1. Saisissez le vSphere PowerCLI aquí (précédemment appelé VI Toolkit (for Windows) ) ; il comprend l'API VMware.Vim et les classes d'implémentation sous-jacentes nécessaires auxquelles l'interface s'en remet (bien que, naturellement, cette dernière ne soit pas évidente à la lecture de la documentation). 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 les bibliothèques qui nous intéressent pour la portabilité plus tard).

  2. Créez un projet VS, et ajoutez-y un peu de code "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. Si cela fonctionne et imprime des informations sur vos VMs, alors 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 est juste l'interface, et les implémentations réelles par protocole sont dans des fichiers comme VimService40.dll que vous auriez dû obtenir à l'étape 1.

  4. Une fois que vous voulez déployer ce code quelque part, vous devez envoyer les dlls 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 depuis le Global Assembly Cache.

    Récupérer la DLL de VimService dans le 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 construire et déployer un code qui fonctionne avec les boîtiers ESX.

2 votes

Excellente réponse, merci ! J'ai en fait écrit un programme de test en utilisant VMware.Vim, et maintenant que je sais que c'est ce dont j'ai besoin, je vais l'explorer davantage. Remarque : ce genre d'âneries à but lucratif est la raison pour laquelle je m'en tiens généralement aux solutions open source...

0 votes

Merci beaucoup @coffeetocode. Votre réponse m'a beaucoup aidé. Merci .....

0 votes

J'ai beaucoup écrit sur ce sujet il y a longtemps, peut-être que c'est encore utile ! communities.vmware.com/message/1806388?tstart=0#1806388

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X