Avec la sortie prochaine de la Beta Consumer Preview de Windows 8, j’avais envie de revenir sur une des fonctionnalités que j’attends le plus et que, en bon geek que je suis, j’utilise déjà : Hyper-V 3 ainsi son module PowerShell.
Il y a déjà pléthore de posts de parts et d’autres qui référençent les différentes nouvelles fonctionnalités d’Hyper-V 3 (les réplicat, VHDX, disponibilité sur Windows 8, SAN virtuels…) mais je n’en ait pas vu beaucoup sur les avancées niveau scripting. Bien entendu, ces informations ne valent que pour la Developer Preview et sont sujêtes à changement.
On pourrait croire qu’avec WinRT et Metro, tout est axé sur le tactile et au diable les shells ! Il n’en est rien. Pour donner un ordre d’idée, Windows 8 Developer Preview contient dans les 45 modules ( (Get-Module -ListAvailable).Count ) pour pouvoir tout piloter ou presque avec une facilité déconcertante. Bien que ce soit toujours possible, utiliser WMI n’est plus une obligation pour arriver à ses fins.
Hyper-V étant un citoyen de première classe, il dispose lui aussi de son module qu’on référence comme suit depuis un PowerShell en mode Administrateur (vous n’avez pas désactivé l’UAC, n’est-ce pas ??) :
Import-Module Hyper-V
Microsoft n’a pas été avare sur les commandes, il n’y en a pas moins de 148 !

Avec, on peut pratiquement tout faire depuis la création d’une VM à la configuration d’un SAN virtuel.
Je n’ai pas testé l’intégralité des commandes mais la majorité que j’aie vue implémente les “paramètres communs” :

Ces paramètres que, dans l’idéal, toute commande PowerShell devrait implémenter permettent d’afficher ou non des messages de confirmation avec Confirm (à désactiver avec prudence !) et de contrôler un tir à blanc avec WhatIf.
Par exemple, la commande ci dessous lance un tir à blanc de création de VM :

Qu’est-ce que ça pourrait donner si on voulait pouvoir rendre l’intégralité d’un script inerte simplement en changeant un commutateur ? Prenons le script suivant :
ComplexHyperVSuperScript.ps1:
param ([switch]$WhatIf = $false)
Import-Module Hyper-V -ErrorAction:SilentlyContinue
New-VM -Name Toto -NoVHD -WhatIf:$WhatIf
New-VHD -Path ./test.vhd -SizeBytes 3145728 -WhatIf
D’une complexité folle, il créé une VM Toto et un VHD test.vhd. Grâce au commutateur global au script $WhatIf que l’on passe en paramètre à tous nos appels de fonctions, on peut arriver à un résultat assez prédictible et testable. Ainsi, le script avec WhatIf et sans donnera les résultats ci-dessous :

Le premier appel n’affiche que des messages (qu’on pourrait qualifier d’un peu trop synthétiques) indiquant ce qui sera fait tandis que le second effectue les actions et retourne des résultats détaillés.
Et ces résultats sont très utiles car il ne s’agit pas de simples lignes de textes mais d’objets. Les commandlets Hyper-V ont toutes des signatures similaires à celle-ci :

Elles retournent un Object .NET correspondant à ce qui a été manipulé par la commande. Dans notre script ci-dessus, il s’agissait respectivement d’un objet VM et d’un objet VHD, eux-mêmes avec leurs méthodes et leurs propriétés.
Et c’est très intéressant ! Car avec la notion de sous-shells, on a la possibilité de chaîner plusieurs appels de commandes redirigeant ainsi la sortie d’une à l’entrée de la suivante. Ainsi, la ligne ci-dessous me permettra de réduire la taille occupée sur disque de tous les VHD de toutes les VM présentes sur mon Hyper-V :
Get-VM | Get-VHD | Optimize-VHD
On peut imaginer aussi la création de machines de tests (délibérément sans VHD pour la simplicité de l’exemple) ainsi que leur suppression :
foreach ($i in 1..10) { New-VM -Name "TestVM_$i" -MemoryStartupBytes 1073741824 -NoVHD | Set-VMMemory -DynamicMemoryEnabled:$true -StartupBytes 1073741824 -MaximumBytes 2147483648 -MinimumBytes 826277888 }
Get-VM Test* | Remove-VM -Confirm:$false -Force
Les développeurs qui n’ont que 2 ou 3 VM de développement n’en auront pas forcément l’utilité mais, personnellement, il m’est arrivé de jongler entre un client où je devais émuler une infra à 3 VM (UAG, ADFS, SP) et d’autres clients avec encore d’autres configurations. La flemme aidant, j’ai fini par écrire quelques fonctions dans mon profile PowerShell afin de lancer et éteindre mes grappes de VM en un seul appel de commande.
Typiquement, une fonction qui appelle Start-VM “Toto”, “Tutu”, “Tata” en arrivant le matin et une autre qui appelle Shutdown-VM/Save-VM “Toto”, “Tutu”, “Tata” le soir.
Pour paraphraser l’Agent Smith, "on ne devrait jamais confier à un humain le travail d’un programme"; Windows (Server) 8 sera résolument dans le même esprit.
J’espère que cet avant-gout vous aura donné l’eau à la bouche !