Question Tableau de bord VMware

Plus d'informations
il y a 12 ans 4 mois #4427 par Soares
Tableau de bord VMware a été créé par Soares
Hello
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.

Plus d'informations
il y a 12 ans 4 mois #4428 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Tableau de bord VMware
Salut,
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:

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

Idem, mais tu souhaites terminer la boucle uniquement par une saisie clavier ?


Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 4 mois #4433 par daniel soares
Réponse de daniel soares sur le sujet Re:Tableau de bord VMware
Laurent Dardenne écrit:

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


:woohoo: j'ai retrouvé mon compte !!!<br><br>Message édité par: Dan, à: 23/03/09 13:57

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 4 mois #4436 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Tableau de bord VMware
Dan écrit:

je viens de voir un de tes post sur les API win32 tres complet je vais surement pouvoir trouver de quoi avancer

J'ai trouvé ceci; à adapter et à tester :
[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 :P

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 4 mois #4437 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Tableau de bord VMware
Un premier jet :
[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 \&quot;Réduire\&quot; 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 \&quot;Réduire\&quot; 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 \&quot;Réduire\&quot;
Remove-MinimizeMenu $SystemMenu


#La fenêtre ne reste plus au premier plan
StayOnTop $PSWindowHandle -OFF
#Rétabli le menu \&quot;Réduire\&quot; 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.

Plus d'informations
il y a 12 ans 4 mois #4438 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Tableau de bord VMware
Pour la gestion du clavier une possibilité sans API, enfin juste celles de PS :
[code:1]
$ESCkey = 27
$Qkey = 81
$Stop=$false
while (!$Stop) {
sleep -m 500
Write-host \&quot;.\&quot;-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(\&quot;NoEcho,IncludeKeyUp\&quot;)
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.

Temps de génération de la page : 0.112 secondes
Propulsé par Kunena