L'objectif de ce script est de vérifier la surallocation des vCPU en effectuant un calcul de ratio entre les pCPUs et les vCPUs sur l'ensemble des ESXi d'un Cluster ciblé.
Il sera possible de prendre en compte soit seulement les VMs Powered On soit l'ensemble des VMs en incluant les VMs Powered Off
<#
. AUTEUR : Antoine JOVELIN
. FONCTION : Vérification du ratio pCPUs/vCPUs sur l'ensemble des ESXi d'un Cluster
. UTILISATION :
- Lancer le script
#>
cls
# Declaration des fonctions
$herestring = @"
***** L'INSTALLATION A ECHOUEE *****
POUR INSTALLER POWERCLI :
1- RECUPERER LE MODULE DEPUIS CE LIEN : "https://developer.vmware.com/web/tool/vmware-powercli"
2- COPIER LE CONTENU DE L'ARCHIVE DANS "C:\Users\NOM_DU_USER\Documents\WindowsPowerShell\Modules"
3- RELANCER LE SCRIPT
"@
function verifPowerLI {
if($MyModules.name -match "VMware.PowerCLI"){
Write-Host "Le module PowerCLI est installé. Le script va continuer" -ForegroundColor Green
}else{
Write-Host "Le module PowerCLI n'est PAS installé. Le script ne pourra pas continuer" -ForegroundColor Yellow
do{
$reponse = Read-Host " Installer le module VMware.PowerCLI ? [oui/non] "
Switch ($reponse){
oui{
Install-Module -name vmware.powercli -Scope CurrentUser -Confirm:$false -Force
if($MyModules -notcontains "VMware.PowerCLI"){
Write-Host $herestring -ForegroundColor red
sleep 3
Write-Host " Fin du script dans quelques secondes" -ForegroundColor yellow
1..5 | Sort-Object -Descending | %{Start-Sleep -Seconds 1;Write-Host " $_ " -ForegroundColor yellow}
Write-Host;
exit
}
}
non{
Write-Host " Fin du script dans quelques secondes" -ForegroundColor yellow
1..5 | Sort-Object -Descending | %{Start-Sleep -Seconds 1;Write-Host " $_ " -ForegroundColor yellow}
Write-Host;
exit
}
}
}while(($reponse -ne "oui") -and ($reponse -ne "non"))
}
}
function vcenter-connect{
$VC = Read-Host -Prompt " Entrer le nom de vCenter "
$cred = Get-Credential
Write-Host;
Write-Host -ForegroundColor cyan "Connexion à vCenter. Merci de patienter..."
Connect-VIServer $VC -Credential $cred
Write-Host;
}
function vcenter-disconnect{
Write-Host;
Write-Host -ForegroundColor cyan "Déconnexion de vCenter..."
Disconnect-viserver -Server $Global:DefaultVIServer -Confirm:$false -Force
Write-Host;
}
function PoweredOn{
$clustername = Read-Host -Prompt " Entrer le nom d'un Cluster" ;
Write-Host;
Write-Host -fore yellow " Cluster $clustername " ;
$vmhosts=Get-Cluster $clustername|Get-VMHost ;
$vms=Get-Cluster $clustername|Get-VM |where {$_.PowerState -eq "PoweredOn"};
$Output=@();$Output1=@();
$totalvcpus=0;
$totalhostthreads=0;
$totalratio=0;
ForEach($vmhost in $vmhosts){
$vcpus=0;$ratio=$null;
$ht=$vmhost.HyperThreadingActive;
if($ht -eq "True"){
$Multiple="0.75"
}else{
$Multiple="1"
};
$hostthreads=$vmhost.extensiondata.hardware.cpuinfo.numcputhreads*$Multiple;
$vms|Where-Object{$_.vmhost -like $vmhost}|ForEach{$vcpus+=$_.numcpu};
if($vcpus -ne "0"){
$ratio= "{0:N1}" -f ($vcpus/$hostthreads)
};
$hvalue=New-Object psobject;
$hvalue|Add-Member -MemberType Noteproperty "Hostname" -value $vmhost.name;
$hvalue|Add-Member -MemberType Noteproperty "pCPU" -Value $hostthreads;
$hvalue|Add-Member -MemberType Noteproperty "vCPU" -Value $vcpus;
$hvalue|Add-Member -MemberType Noteproperty "Ratio" -Value $ratio;
$Output+=$hvalue;
$totalhostthreads += $hostthreads;
$totalvcpus += $vcpus;
$totalratio="{0:N1}" -f ($totalvcpus/$totalhostthreads)
};
$cvalue=New-Object psobject;
$cvalue|Add-Member -MemberType Noteproperty "Hostname" -value "Cluster";
$cvalue|Add-Member -MemberType Noteproperty "pCPU" -Value $totalhostthreads;
$cvalue|Add-Member -MemberType Noteproperty "vCPUs" -Value $totalvcpus;
$cvalue|Add-Member -MemberType Noteproperty "Ratio" -Value $totalratio;
$Output1 += $cvalue;
$Output|ft -autosize;
$Output1|ft -autosize
}
function PoweredOff{
$clustername = Read-Host -Prompt " Entrer le nom d'un Cluster" ;
Write-Host;
Write-Host -fore yellow " Cluster $clustername " ;
$vmhosts=Get-Cluster $clustername|Get-VMHost;
$vms=Get-Cluster $clustername|Get-VM;
$Output=@();$Output1=@();
$totalvcpus=0;
$totalhostthreads=0;
$totalratio=0;
ForEach($vmhost in $vmhosts){
$vcpus=0;$ratio=$null;
$ht=$vmhost.HyperThreadingActive;
if($ht -eq "True"){
$Multiple="0.75"
}else{
$Multiple="1"
};
$hostthreads=$vmhost.extensiondata.hardware.cpuinfo.numcputhreads*$Multiple;
$vms|Where-Object{$_.vmhost -like $vmhost}|ForEach{$vcpus+=$_.numcpu};
if($vcpus -ne "0"){
$ratio= "{0:N1}" -f ($vcpus/$hostthreads)
};
$hvalue=New-Object psobject;
$hvalue|Add-Member -MemberType Noteproperty "Hostname" -value $vmhost.name;
$hvalue|Add-Member -MemberType Noteproperty "pCPU" -Value $hostthreads;
$hvalue|Add-Member -MemberType Noteproperty "vCPU" -Value $vcpus;
$hvalue|Add-Member -MemberType Noteproperty "Ratio" -Value $ratio;
$Output+=$hvalue;
$totalhostthreads += $hostthreads;
$totalvcpus += $vcpus;
$totalratio="{0:N1}" -f ($totalvcpus/$totalhostthreads)
};
$cvalue=New-Object psobject;
$cvalue|Add-Member -MemberType Noteproperty "Hostname" -value "Cluster";
$cvalue|Add-Member -MemberType Noteproperty "pCPU" -Value $totalhostthreads;
$cvalue|Add-Member -MemberType Noteproperty "vCPUs" -Value $totalvcpus;
$cvalue|Add-Member -MemberType Noteproperty "Ratio" -Value $totalratio;
$Output1 += $cvalue;
$Output|ft -autosize;
$Output1|ft -autosize
}
# Debut du script
vcenter-connect
Write-Host;
Write-Host -fore cyan "
##################################################################
# Vérification du ratio CPU sur l'ensemble des ESXi d'un Cluster #
##################################################################"
Write-Host;
Write-Host " Vérification des modules nécessaires " -ForegroundColor Cyan
1..3 | Sort-Object -Descending | %{Start-Sleep -Seconds 1}
$MyModules = Get-Module -ListAvailable | select name
Write-Host;
verifPowerLI
Write-Host;
do{
$reponse = Read-Host -Prompt " Faut-il verifier uniquement les VMs PoweredOn [Entrer : on] ou inclure les VMs PoweredOff ? [Entrer : off] "
if($reponse -eq "on"){
PoweredOn
}elseif($reponse -eq "off") {
PoweredOff
}
}while(($reponse -ne "on") -and ($reponse -ne "off"))
Write-Host;
vcenter-disconnect