Mar 19 2012

Powershell: Inventaire serveurs physiques et VMWare

Nous allons dans ce post voir comment réaliser un inventaire de vos serveurs physiques ainsi que de vos machines virtuelles VMWare et les hôtes physiques sur lesquelles elles sont hébérgées. Si vous possédez un environnement virtualisé sous VMWare ce script peut vous être utile dans le cadre d’un inventaire de licences Windows Server et vous aider à opter pour tel ou tel type de licence. Pour plus d’informations sur le licensing Windows Server en environnement VMWare lire cet article.

Pour chaque objet (Serveur physique, VM, hôte ESX) nous retournons:

  • Le nom de la machine.
  • Le modèle de la machine, dans le cas d’une machine virtuelle nous retournons “VM”.
  • Nombre total de CPU de la machine.
  • Nombre total de Core de la machine.
  • RAM de la machine.
  • OS de la machine. Pour les machines Windows Sever, nous précisons l’édition de l’OS (Enterprise, Standard, Datacenter). Dans le cas d’un hôte ESX, nous retournons “ESX”.

Pour chaque hôte ESX les VM situés sur celui-ci sont listés. Il s’agit d’un cliché à un instant donné, vos VMs étant succeptibles de changer d’hôte ESX avec le mécanisme DRS.

Ce qui donne le résultat suivant:

Pour réaliser cette inventaire nous allons utiliser PowerCli, WMI et les cmdlets AD.

Tout d’abord nous listons les objets ordinateurs Windows Server actifs au cours des 90 derniers jours:

$d = [DateTime]::Today.AddDays(-90)
$servers = Get-ADComputer -searchbase "DC=ldap389,DC=info" -Properties OperatingSystem, OperatingSystemServicePack -Filter 'PasswordLastSet -ge $d' | Where-Object {$_.OperatingSystem -like*server*}

Nous parcourons ensuite l’ensemble des serveurs. Pour Windows 2008, l’édition de l’OS est donnée dans l’attribut OperatingSystem pour le reste nous utilisons la classe Win32_OperatingSystem.

Pour calculer le nombre total de CPUs et de Cores de chaque machine nous utilisons la classe Win32_Processor. Sous Windows 2003, selon la présence du patch KB932370, la manière de calculer est différente:

Pour les OS Windows 2008 et les 2003 patchés avec la KB932370:

$Win32_cpu = Get-WmiObject -class win32_processor -computer $ServerName
$NbCPUs = ($Win32_cpu | measure-object).count
$Nbcores = ($Win32_cpu | measure-object NumberOfCores -sum).sum

Pour les autres (lire ce post pour le détail):

$physCount = new-object hashtable
$Win32_cpu = Get-WmiObject -class win32_processor -computer $ServerName
$Win32_cpu |%{$physCount[$_.SocketDesignation] = 1}
$NbCPUs = $physCount.count
$Nbcores = ($Win32_cpu | measure-object).count

Si le Manufacturer retourné par la classe Win32_ComputerSystem est égal à VMware, Inc. Alors nous avons à faire à une machine virtuelle: Nous cherchons alors l’hote ESX sur lequel est situé le serveur. Les VMs sont regroupées par hote ESX: Ceci grace à un hashtable avec les hôtes ESX contenant un autre hashtable avec les VMs de chaque hôte. Lire cet article pour voir comment nous manipulons les hashtable dans ce script. La clef commune entre l’objet ordinateur AD et l’objet VM sous PowerCli est la valeur DNSHostname coté AD et la valeur Hostname de l’objet Guest de la VM (merci à NiTRo pour le tip).

Si nous avons à faire à un serveur physique nous écrivons directement le résultat dans le fichier de sortie.

Une fois tous nos hôtes ESX et VMs inventoriés, nous recherchons les caractéristiques physiques (Modèle, CPUs, Cores, RAM) de chaque hote ESX grâce à PowerCli comme décrit dans ce post:

$hard = (get-vmhost $esx).Extensiondata.Summary.Hardware
$mem = [int] ($hard.MemorySize/1mb)
$NbCPUs = $hard.NumCpuPkgs
$Nbcores = $hard.NumCpuCores
$model = $hard.Model

Pour télécharger le script complet c’est ici:

Lancer le script dans PowerCli et ne pas oublier de charger le module Active Directory (import-module ActiveDirectory): Voila comment utiliser WMI, PowerCli et les Cmdlets AD dans un seul script 🙂

This post is also available in: Anglais

3 Comments

  • By NiTRo, March 21, 2012 @ 8:35 am

    Je vois dans le script que le nom des vm doivent correspondre à leur hostname pour sur ça fonctionne.

  • By ldap389, March 21, 2012 @ 10:32 am

    Oui les noms de VMs doivent correspondre au hostname. Si ce n’est pas le cas prendre la valeur DNSHostName du cmdlet AD Get-ADComputer $server et la valeur Hostname de (get-vm $server).guest sous PowerCli pour réaliser la correspondance compte AD vs VM.

  • By ldap389, March 21, 2012 @ 3:29 pm

    Vu avec Nitro le script a été corrigé et optimisé en conséquence. Les noms de VMs ne doivent plus être necessairement égaux au noms des hosts.

Other Links to this Post

RSS feed for comments on this post. TrackBack URI

Leave a comment

*

WordPress Themes

Blossom Icon Set

Software Top Blogs