Estrarre dati da VMware vCenter

La diffusione ed il successo degli ambienti virtualizzati con VMware e' notevole sia per un utilizzo personale che per ambienti Enterprise.
Nelle soluzioni aziendali VMware consente la gestione degli host e delle VM con vCenter Server che si appoggia ad un database MS-SQL Server. In questo documento vediamo come estrarre i dati piu' significativi da tale database.

Le informazioni contenute sono infatti molti importanti sia per la gestione sistemistica che per la documentazione degli asset ed e' quindi spesso utile integrare tali dati con altri database aziendali.

Codice

Lo schema utilizzato da vCenter e' costituito da una serie di tabelle e viste che mantengono i dati dei server presenti (VPX_HOST), delle Virtual Machine (VPX_VM), ... vCenter mantiene inoltre una gerarchia di oggetti nella tabella VPX_ENTITY che puo' rappresentare le piu' complesse strutture ed aggregazioni utilizzando la tecnica del self-join. Il legame tra entita' e' mantenuto sulle colonne ID e PARENT_ID mentre la colonna TYPE_ID identifica la tipologia di oggetto (eg 0 -> VM, 1 -> Host, 13 -> VApp).

La prima estrazione di dati e' relativa all'elenco dei server che costituiscono le nostre farm e dei relativi dati tecnici.
Il codice SQL necessario e':

SELECT A.ID, A.NAME, B.DATACENTER_ID, B.DNS_NAME, B.IP_ADDRESS, B.PRODUCT_NAME, B.PRODUCT_FULLNAME, B.PRODUCT_VENDOR,
    B.PRODUCT_VERSION, B.PRODUCT_BUILD, B.PRODUCT_OS_TYPE, B.PRODUCT_LINE_ID, B.PRODUCT_API_TYPE,
    B.PRODUCT_API_VERSION, B.HOST_VENDOR, B.HOST_MODEL, B.CPU_MODEL, B.CPU_COUNT, B.CPU_CORE_COUNT,
    B.CPU_THREAD_COUNT, B.CPU_HZ, B.MEM_SIZE, B.BOOT_TIME, B.BOOT_TIME_ON_HOST, C.NAME AS GROUP_NAME
FROM VMW.VPX_ENTITY A, VMW.VPX_HOST B, VMW.VPX_ENTITY C
WHERE A.ID = B.ID
AND A.TYPE_ID = 1
AND C.ID = A.PARENT_ID
ORDER BY A.ID

Il dettaglio delle informazioni disponibili sulla base dati e' molto elevato. Nell'ottenere l'elenco delle Virtual Machine vogliamo estrarre qualche informazione in piu': l'IP associato (determinando il principale), la somma dello spazio assegnato, la descrizione (mantenendola in una sola riga), ... in questo caso serve qualche trucco SQL in piu'.
Ecco l'esempio di codice:

SELECT A.ID, B.DATACENTER_ID, B.POWER_STATE, B.RESOURCE_GROUP_ID, B.GUEST_OS, B.GUEST_FAMILY,
    B.GUEST_STATE, B.MEM_SIZE_MB, B.MEMORY_RESERVATION, B.CPU_RESERVATION, B.NUM_VCPU,
    B.NUM_NIC, B.NUM_DISK, B.DNS_NAME, B.IS_TEMPLATE, B.HOST_ID, B.BOOT_TIME,
    CASE WHEN  
        (SELECT COUNT(*)
         FROM VMW.VPX_IP_ADDRESS 
         WHERE ENTITY_ID = A.ID ) > 1 
     THEN 
        (SELECT LTRIM(RTRIM(SUBSTRING((SELECT '-' + IP_ADDRESS 
         FROM VMW.VPX_IP_ADDRESS 
         WHERE ENTITY_ID = A.ID
         AND SUBSTRING(IP_ADDRESS,1,1)<>'f'
         AND IP_ADDRESS <> '127.0.0.1'
         AND IP_ADDRESS <> '0.0.0.0'
         FOR XML PATH('')),2,100000))) )     
     ELSE
        B.IP_ADDRESS
     END AS IP_ADDRESS, 
     ( SELECT SUM(CONVERT(BIGINT,CAPACITY))
       FROM VMW.VPX_GUEST_DISK
       WHERE VM_ID = A.ID
       GROUP BY VM_ID ) AS CAPACITY,
     ( SELECT SUM(CONVERT(BIGINT,FREE_SPACE))
       FROM VMW.VPX_GUEST_DISK
       WHERE VM_ID = A.ID
       GROUP BY VM_ID ) AS FREE_SPACE,
    REPLACE(REPLACE(REPLACE(B.DESCRIPTION,CHAR(13),' '),CHAR(10),' '),CHAR(124),' ') AS DESCRIPTION,
    REPLACE(REPLACE(REPLACE(B.ANNOTATION,CHAR(13),' '),CHAR(10),' '),CHAR(124),' ') AS ANNOTATION,
    C.NAME,
    CASE WHEN E.NAME = 'vm' THEN (CASE WHEN D.NAME LIKE '%template%' THEN 'TEMP' ELSE D.NAME END) ELSE E.NAME END AS GROUP_NAME,
    CASE WHEN E.NAME = 'vm' THEN NULL ELSE (CASE WHEN D.NAME = 'vm' THEN NULL ELSE D.NAME END) END AS SUBGROUP_NAME,
    C.GUEST_ID, C.GUEST_FULL_NAME, C.ALTERNATE_GUEST_NAME
FROM VMW.VPX_ENTITY A, VMW.VPX_VM B, VMW.VPX_VM_CONFIG_INFO C, VMW.VPX_ENTITY D, VMW.VPX_ENTITY E
WHERE A.ID = B.ID
AND B.ID = C.ID
AND A.TYPE_ID = 0
AND D.ID = A.PARENT_ID
AND E.ID = D.PARENT_ID
AND B.IS_TEMPLATE = 0
ORDER BY C.NAME

Note

Le query di esempio possono essere eseguite da un client SQL Server, da un programma Java, da un ETL (eg. Pentaho Kettle), ...
La base dati su cui si appoggia il vCenter Server e' tipicamente ospitata su Microsoft SQL Server. Sono certificati altri RDBMS (eg Oracle, DB2) ma la quasi totalita' delle installazioni utilizza SQL Server.

A seconda delle versioni del vCenter cambiano le versioni di SQL Server certificate e, un poco, anche la struttura della base dati. Gli esempi contenuti in questa pagina sono relativi alla versione 5.1 ma valgono, con poche eccezioni, anche sulle altre versioni (eg. nelle versioni precedenti alla 4.1 non e' presente la tabella VPX_VM_CONFIG_INFO).

E' possibile estrarre i dati dalla console del vCenter Server con il formato voluto (eg. Excel); tuttavia tale operazione e' manuale.

E' possibile estrarre i dati dal vCenter server con uno script PowerCLI; tuttavia tale operazioni richiede un poco di programmazione e qualche passo in piu' rispetto ad un accesso SQL:

Connect-VIServer -Server server -User user -Password pass $cluster = "Cluster_name" $strout = "VMName,NIC,Network\n" $nics = get-cluster $cluster | get-vm | sort-object Name | get-networkadapter foreach ($nic in $nics) { $strout = $strout + $nic.Parent + "," + $nic.Name + "," + $nic.networkname + "\n" } out-file -filepath out.csv -inputobject $strout -encoding ASCII disconnect-viserver * -force -confirm:$false

Altri documenti di questo tipo su questa pagina. Hack


Titolo: Estrarre dati da VMware vCenter
Livello: Hack (5/5)
Data: 31 Ottobre 2012 - Halloween
Versione: 1.0.0 - 31 Ottobre 2012
Autore: mail [AT] meo.bogliolo.name, Alessandro Governa