Question Tableau de bord VMware
- Soares
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 4
- Remerciements reçus 0
apres un long moment d'absence, dur dur de se souvenir de son compte et mot de passe
le temps de me mettre a jour de toutes les nouveautés
je vous propose un script qui permet de monitorer une infra VMWARE ESX testé sur les versions suivantes
ESX 3.5 VC 2.5 avec VI toolkit 1 et powershell v2
ce script permet d'avoir un etat des ressources cpu et memoire pour tous les ESX d'une ou plusieurs Infras
gérées par VC 2.5 sous la forme suivante
[code:1]
range % CPU MEM
00-10 19 5
10-20 7 2
20-30 0 6
30-40 0 11
40-50 1 3
50-60 0 1
60-70 0 0
70-80 0 0
80-90 0 0
90-100 1 0
cpu max ESX 19
mem max ESX 02
[/code:1]
[code:1]
#
#
#- Tableau de bord Infra VMWARE
#
#
$tableau =\"p:\fiche_change\tableau_de_bord.txt\"
\"esx,cpurange,memrange\" | Out-File $tableau -Encoding oem -Force
$infra1 = connect-viserver serveurvc1
$infra2 = connect-viserver serveurvc2
cls
# Recuperation des valeurs de performance
$interrogation_host = {
$cpuaverage = get-stat -entity $esx -realtime -stat cpu.usage.average |
measure-object -property value -average
$memaverage = get-stat -entity $esx -realtime -stat mem.usage.average |
measure-object -property value -average
$script:cpurange = [math]::truncate([math]::truncate($cpuaverage.average)/10)+1
$script:memrange = [math]::truncate([math]::truncate($memaverage.average)/10)+1
}
# modification du fichier, remplacement des infos de perf par ESX en temps reel
$modif_tableau = {
$locesx =(select-string \"$esxcourt\" $tableau).LineNumber
if ($locesx-eq $null){
\"$esxcourt,$cpurange,$memrange\" | Out-File $tableau -Encoding oem -Append -Force
}
else {
$temptableau = get-content $tableau
$temptableau[$locesx-1] = \"$esxcourt,$cpurange,$memrange\"
$temptableau | Set-Content $tableau
}
}
# Affichage du tableau de bord a l'ecran
$affichage = {
[array]$result =\"range %`tCPU`tMEM\"
$var = Import-Csv $tableau # Affiche les valeurs du fichier
for ($i=1;$i -le 10;$i++){
$a = \"$($i-1)0-$($i)0\"
# place les ESX dans leur range de consomation (increment 10%)pour chaque range compte le nombre d'ESX
$checkcpu =$var|where{$_.cpurange -eq $i}
$checkmem =$var|where{$_.memrange -eq $i}
if($checkcpu.count -ne $null){$b=$checkcpu.count}
elseif($checkcpu.esx -eq $null ){$b=0}
else{$b=1}
if($checkmem.count -ne $null){$c=$checkmem.count}
elseif($checkmem.esx -eq $null ){$c=0}
else{$c=1}
[array]$result+=\"$a`t$b`t$c\"
}
# Start-Sleep -s 10 # dans le cas ou on veut une mise a jour plus lente
$var | foreach{
# affiche le nom de l'esx avec plus grande consomation de Cpu
if ($maxcpu -le $_.cpurange){
$maxcpu = $_.cpurange
$maxesxcpu = $_.esx
}
# affiche le nom de l'esx avec plus grande consomation de Cpu
if ($maxmem -le $_.memrange){
$maxmem = $_.memrange
$maxesxmem = $_.esx
}
}
#Affichage du tableau
cls
$result
\"cpu max`t$maxesxcpu\"
\"mem max`t$maxesxmem\"
}
# fonction d'appel des sous routines elle meme appellee par une boucle infinie pour affichage en temps reel
$boucle= {
$esxs = get-vmhost -Server $infra1,$infra2
$esxs |foreach{
$esx = $_
$esxcourt = $_.name.substring(0,8)
&$interrogation_host
&$modif_tableau
&$affichage
}
}
#Boucle infinie pour affichage en temps reel l'ideal serait d'avoir le moyen de mettre la fenetre ps toujours visible
while($infini -ne 100){&$boucle}
# deconnexion des serveurs (ne fonctionne pas dans le cas de la boucle infinie)
disconnect-viserver -server $infra1,$infra2 -confirm:$false
[/code:1]
ce code n'integre pas l'enregistrement des Snapin et la conf de l'environnement VmWare que j'ai integré dans mon profile
[code:1]
Add-PSSnapin VMware.VimAutomation.Core
& \"C:\Program Files\VMware\Infrastructure\VIToolkitForWindows\Scripts\Initialize-VIToolkitEnvironment.ps1\"
[/code:1]
VMWare se developpant de plus en plus peut etre que ca pourra interesser un nombre grandissant d'admins
j'ai cree une boucle infinie pour l'avoir toujours a l'affichage mais pour cela il me manque la possibilité d'afficher une fenetre powershell toujour visible sur mon ecran je ne sais pas si c'est possible
voici la ligne de commande que j'utilise pour lancer le script apres avoir cree un racourci ayant la taille adequate
[code:1]
p:\fiche_change\powershell.lnk \"P:\fiche_change\tableau-bord.ps1\" -nologo -noninteractive
[/code:1]
autre bug pour sortir de la boucle infini je n'ai que ctrl S ce qui empeche l'execution de la ligne de deconnexion pas tres grave mais si qqun connait une solution
Message édité par: Daniel, à: 23/03/09 09:50<br><br>Message édité par: Daniel, à: 23/03/09 09:51
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6298
- Remerciements reçus 68
Daniel écrit:
il me manque la possibilité d'afficher une fenetre powershell toujour visible sur mon ecran je ne sais pas si c'est possible
[/suote]
Peut-être en utilisant les API Win32.
Daniel écrit:Idem, mais tu souhaites terminer la boucle uniquement par une saisie clavier ?autre bug pour sortir de la boucle infini je n'ai que ctrl S ce qui empeche l'execution de la ligne de deconnexion pas tres grave mais si qqun connait une solution
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- daniel soares
- Hors Ligne
- Membre premium
-
- Messages : 133
- Remerciements reçus 0
Idem, mais tu souhaites terminer la boucle uniquement par une saisie clavier ?
je veux que ce soit a l'initiative de l'utilisateur
l'idée etant que l'affichage se reactualise jusqu'a ce que l'utilisateur decide d'arreter la boucle.
je viens de voir un de tes post sur les API win32 tres complet je vais surement pouvoir trouver de quoi avancer

Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6298
- Remerciements reçus 68
J'ai trouvé ceci; à adapter et à tester :je viens de voir un de tes post sur les API win32 tres complet je vais surement pouvoir trouver de quoi avancer
[code:1]void CTopDlgDemoDlg::«»StayOnTop() const
{
CRect rect;
// get the current window size and position
GetWindowRect( rect );
// now change the size, position, and Z order
// of the window.
::«»SetWindowPos(m_hWnd , // handle to window
HWND_TOPMOST, // placement-order handle
rect.left, // horizontal position
rect.top, // vertical position
rect.Width(), // width
rect.Height(), // height
SWP_SHOWWINDOW // window-positioning options);
}[/code:1]
Pour GetWindowRect( rect ) il faut utiliser la fonction New-Struct dispo dans le forum contributions.
En même temps une Form, couplée à PS, serait peut être plus appropriée pour implémenter ces fonctionnalités.
Il restera je pense un soucis avec le menu réduire qui reste actif.Pour que la fenêtre reste au dessus des autres elle doit au minimum être affichée

Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6298
- Remerciements reçus 68
[code:1]
Set-Variable PSWindowHandle -value ((Get-Process -Id $pid).MainWindowHandle) -option Constant
function StayOnTop([IntPtr] $hWnd, [switch] $OFF)
{
$HWND_TOPMOST=-1
$SWP_SHOWWINDOW = 64;
$HWND_NOTOPMOST=-2
$SWP_NOMOVE=2
$SWP_NOSIZE=1
$SWP_NOREDRAW=8
$FlagTop=$HWND_TOPMOST
if ($Off)
{$FlagTop=$HWND_NOTOPMOST}
# TODO: En théorie pas de modification de la taille de la fenêtre
# mais légére modification de la taille et de la position...
[void](SetWindowPos $hWnd $FlagTop 0 0 0 0 ($SWP_NOMOVE -And $SWP_NOSIZE -And $SWP_NOREDRAW -And $SWP_SHOWWINDOW))
}
#La fenêtre reste au premier plan
StayOnTop $PSWindowHandle
function Remove-MinimizeMenu([IntPtr] $hMenu)
{ #Supprime le menu \"Réduire\" du menu système d'une fenêtre
#Minimizes the window.
$SC_MINIMIZE = 61472;
RemoveMenu $hMenu $SC_MINIMIZE $MF_BYCOMMAND
}
function Add-MinimizeMenu([IntPtr] $hMenu)
{ #Ajoute un menu \"Réduire\" au menu système d'une fenêtre
#Minimizes the window.
$SC_MINIMIZE=61472
$MF_STRING = 0
AppendMenu $hMenu $MF_STRING $SC_MINIMIZE 'Réduire'
}
#Obtient le handle du menu système de la fenêtre courante
$SystemMenu= GetSystemMenu $PSWindowHandle $False
#Supprime le menu \"Réduire\"
Remove-MinimizeMenu $SystemMenu
#La fenêtre ne reste plus au premier plan
StayOnTop $PSWindowHandle -OFF
#Rétabli le menu \"Réduire\" TODO la position n'est plus celle d'origine
Add-MinimizeMenu $SystemMenu
[/code:1]
ça fonctionne, il reste 2 points à fignoler.
Ensuite si tu as + fenêtres ayant ce comportement d'activé, tu ne peux être assuré que ta fenêtre restera tjr au premier plan. Si elles sont côte à côte pas de pb.
A moins de placer un timer qui la replace tjr au 1er plan...
Pour la variable PSWindowHandle le mieux est de la créer dans le package ou le profil. Ainsi on est sûr de tjr accéder au bon handle.
J'ai une nouvelle version du package de gestion des API Windows mais je ne l'ai pas encore testé.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6298
- Remerciements reçus 68
[code:1]
$ESCkey = 27
$Qkey = 81
$Stop=$false
while (!$Stop) {
sleep -m 500
Write-host \".\"-nonewline
#http://msdn.microsoft.com/en-us/library/system.management.automation.host.pshostrawuserinterface.keyavailable(VS.85).aspx
if ($host.UI.RawUI.KeyAvailable) {
$key = $host.ui.RawUI.ReadKey(\"NoEcho,IncludeKeyUp\")
if (($key.VirtualKeyCode -eq $ESCkey) -OR ($key.VirtualKeyCode -eq $Qkey))
{ $Stop=$True}
} #If KeyAvailable
}#While[/code:1]
D'après blogs.msdn.com/powershell/archive/2007/0...with-wmi-events.aspx
Message édité par: Laurent Dardenne, à: 23/03/09 19:14
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Contributions à la communauté
- Tableau de bord VMware