OVH Community, votre nouvel espace communautaire.

[SDK][PYTHON] Lister les vms d'un vCenter.


cgregoire
20/02/2015, 09h48
Pour suivre ce premier script, en voici un autre pour lister les vms présentes dans un vApp.
Les vApps se trouvant dans une autre vue, il faut passer par les hosts pour pouvoir les lister.

Code:
./getVmsFromvApp.py -s pcc-XXX-XXX-XXX-XXX.ovh.com -u username -p password
Code:
#!/usr/bin/env python

import pyVmomi
import argparse
import atexit
from pyVmomi import vim

from pyVim.connect import SmartConnect, Disconnect

import itertools

def GetArgs():

   parser = argparse.ArgumentParser(description='Process args for retrieving all the Virtual Machines')
   parser.add_argument('-s', '--host', required=True, action='store',help='Remote host to connect to')
   parser.add_argument('-o', '--port', type=int, default=443, action='store',help='Port to connect on')
   parser.add_argument('-u', '--user', required=True, action='store',help='User name to use when connecting to host')
   parser.add_argument('-p', '--password', required=False, action='store',help='Password to use when connecting to host')
   args = parser.parse_args()
   return args



def printVmInformation(vm, depth=1):

    maxdepth = 10 # avoid infinite loop

    if hasattr(vm, 'childEntity'):
        if depth > maxdepth:
            return
        vmList = vm.childEntity
        for c in vmList:
            printVmInformation(c, depth+1)
        return

    try:
        summary = vm.summary
        print "##################################################################"
        print "Name       : ", summary.config.name
        print "MoRef      : ", summary.vm
        print "State      : ", summary.runtime.powerState
        print "##################################################################"
    except:
        pass

def main():

    args = GetArgs()

    si = SmartConnect(host=args.host,user=args.user,pwd=args.password,port=int(args.port))

    if not si:
       print("Could not connect to the specified host using specified "
             "username and password")
       return -1

    atexit.register(Disconnect, si)

    content = si.RetrieveContent() # get root folder 

    for datacenter in content.rootFolder.childEntity:
        print "##################################################################"
        print "##################################################################"
        print "###       datacenter : " + datacenter.name
        print "##################################################################"

        if hasattr(datacenter.vmFolder, 'childEntity'):
            hostFolder = datacenter.hostFolder
            for hostChild in hostFolder.childEntity:
                if type(hostChild) is vim.ClusterComputeResource:
                    for vapp in  hostChild.resourcePool.resourcePool:
                        if type(vapp) is vim.VirtualApp:
                            print "##################################################################"
                            print "vApp : ",vapp.name
                            print "##################################################################"
                            print "VMs:"

                            for vm in vapp.vm:
                                print "\t",vm.name


# Start program
if __name__ == "__main__":
   main()

Il vous suffira de combiner les deux scripts pour obtenir l'ensemble des vms de votre Pcc.

Bon test

cgregoire
19/02/2015, 11h46
Bonjour,
voici un exemple de comment lister les vms d'un vCenter en utilisant le SDK Python pyvmomi.
Le fonctionnement du SDK python est un peu différent du SDK perl.

Ce schéma peut aider à comprendre le fonction du SDK Python :



La récupération des entities se fait par récursivité.

L'exemple suivant récupère les vms de touts les datacenters du Pcc (ou le user à les droits au minimum en RO) puis affiche quelques informations comme son nom, son moref et son state.

Utilisation de la commande :
Code:
./getVmsInfo.py -s pcc-XXX-XXX-XXX-XXX.ovh.com -u username -p password

scripts getVmsInfo.py:
Code:
#!/usr/bin/env python

import pyVmomi
import argparse
import atexit
from pyVmomi import vim

from pyVim.connect import SmartConnect, Disconnect

import itertools

def GetArgs():

   parser = argparse.ArgumentParser(description='Process args for retrieving all the Virtual Machines')
   parser.add_argument('-s', '--host', required=True, action='store',help='Remote host to connect to')
   parser.add_argument('-o', '--port', type=int, default=443, action='store',help='Port to connect on')
   parser.add_argument('-u', '--user', required=True, action='store',help='User name to use when connecting to host')
   parser.add_argument('-p', '--password', required=False, action='store',help='Password to use when connecting to host')
   args = parser.parse_args()
   return args



def printVmInformation(vm, depth=1):

    maxdepth = 10 # avoid infinite loop

    if hasattr(vm, 'childEntity'):
        if depth > maxdepth:
            return
        vmList = vm.childEntity
        for c in vmList:
            printVmInformation(c, depth+1)
        return

    try:
        summary = vm.summary
        print "##################################################################"
        print "Name       : ", summary.config.name
        print "MoRef      : ", summary.vm
        print "State      : ", summary.runtime.powerState
        print "##################################################################"
    except:
        pass

def main():

    args = GetArgs()

    si = SmartConnect(host=args.host,user=args.user,pwd=args.password,port=int(args.port))

    if not si:
       print("Could not connect to the specified host using specified "
             "username and password")
       return -1

    atexit.register(Disconnect, si)

    content = si.RetrieveContent() # get root folder 

    for datacenter in content.rootFolder.childEntity:
        print "##################################################################"
        print "##################################################################"
        print "###       datacenter : " + datacenter.name
        print "##################################################################"

        if hasattr(datacenter.vmFolder, 'childEntity'):
            vmFolder = datacenter.vmFolder
            vmList = vmFolder.childEntity
            for vm in vmList:
                printVmInformation(vm)


# Start program
if __name__ == "__main__":
   main()

Pour l'installation du SDK python, je vous invite à vous reportez au lien suivant, section Installation :
https://github.com/vmware/pyvmomi

Bon test.