Automatiser le déploiement de machines virtuelles avec PowerShell – Partie 2
Dans le premier billet nous avons vu , les commandes PowerShell nécessaire au déploiement d’une VM et comment vérifier les étapes de customisation de l’OS.
Maintenant nous allons détailler les commandes pour l’ajout et la modification de Cpu, de Mémoire, de volume Disque et des cartes réseaux.
Pour customiser la VM, nous allons tout d’abord l’arrêter …
Shutdown-VMGuest -VM $myVM.name -confirm:$false -ErrorAction Stop
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
. Start-Sleep -Seconds 10; # --------------------------------------------------------------------------------------------------------------------------- # Arret de la VM # --------------------------------------------------------------------------------------------------------------------------- try{ Shutdown-VMGuest -VM $myVM.name -confirm:$false -ErrorAction Stop <strong>waitPowerOff -objectVm $myVM</strong> } catch{ ...... mes actions en cas d'erreur } . |
Une fois le ShutDown initier, nous allons attendre que le statut de la VM nous renvoi la valeur « PoweredOff ». Vous pouvez insérer dans votre fonction un TimeOut pour ne pas rester bloquer sur le déploiement d’une VM qui ne voudrait pas s’arrêter.
(Get-vm -name $objectVm.name).PowerState -ne « PoweredOff »
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
. <# --------------------------------------------------------------------------------------------------------------------------- # # Function qui attends que la Vm soit à l'arret. # # --------------------------------------------------------------------------------------------------------------------------- #> function waitPowerOff{ param( [PSObject[]]$objectVm) write-host " - Function waitPowerOff " write-host " Attente Arret de la VM " $w=0 do { Start-Sleep -Seconds 10; $w+=1 }while((get-vm -name $objectVm.name).PowerState -ne "PoweredOff" -And $w -lt 60); if($w -lt 60){ write-host " Le serveur $($objectVm.name) s'est correctement arrété." return $true } else { write-host " - Le serveur $($objectVm.name) : TimeOut de 10 min atteint lors de l’arrêt de la machine." return $false } } . |
Une fois que la VM est arrêtée, nous allons commencer la phase de customisation du HardWare
1 – Paramétrage de la Mémoire
Pour le paramétrage de la mémoire, on utilise la cmdlet Set-vm avec l’argument MemoryGB. vous pouvez trouver ici le détail des arguments utilisables avec cette cmdlet.
Comme nous stockons ce paramètre en MB, nous devons dans notre fonction la convertir en GB avant d’opérer le paramétrage. Pour l’arrondi nous utilisons la méthode [math]::Floor [decimal]
Get-vm -name $objectVm.name | Set-vm -MemoryGB $vmemoryGB -Confirm:$false -ErrorAction Stop
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
. <# --------------------------------------------------------------------------------------------------------------------------- # Function de parametrage de la memoire # # Modification de la Memoire en GB # Car nous stockons nos informations en MB # --------------------------------------------------------------------------------------------------------------------------- #> function parametrageMemoire{ param([PSObject[]]$objectVm) $vmemoryGB=[math]::Floor([decimal]$objectVm.memoryMb/1024) write-host " - Customisation memoire : $($vmemoryGB) GB" try{ get-vm -name $objectVm.name | set-vm -MemoryGB $vmemoryGB -Confirm:$false -ErrorAction Stop write-host " Modification de la memoire OK --> $($vmemoryGB)" Start-Sleep -Seconds 5; return $true } catch{ write-host " Erreur pendant l'operation de modification de la memoire." return $false } } . |
2 – Paramétrage des vCPU
Pour le paramétrage CPU de la Vm, on va s’appuyer sur les commandes « VirtualMachineConfigSpec » et « ReconfigVM_Task ».
Avec la commande VirtualMachineConfigSpec, on va créer un objet « cpuspec » dans lequel on va encapsuler les nouveaux paramètres (processeurs) de la Vm. vous pouvez consulter ici les différents paramètres modifiable.
Puis avec à la commande « ReconfigVM_Task« , on va modifier la VM avec l’objet « cpuspec » .
$cpuspec = New-Object -Type VMware.Vim.VirtualMachineConfigSpec -Property @{« NumCoresPerSocket » = $objectVm.nbCoeur; »NumCPUs » = $numCPU}
$nameVm.ExtensionData.ReconfigVM_Task($cpuspec)
- Quand on crée l’objet « cpuspec », on lui transmet deux paramètres :
-
- Le nombre de CPU sur la machine . Nbre CPU = Nbre Socket * Nbre Coeur
- Le nombre de cœur par Socket.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
. function parametrageCPU{ param([PSObject[]]$objectVm) Write-host " - Customisation CPU " $numCPU=( [int]$objectVm.nbProc * [int]$objectVm.nbCoeur) $cpuspec = New-Object -Type VMware.Vim.VirtualMachineConfigSpec -Property @{"NumCoresPerSocket" = $objectVm.nbCoeur;"NumCPUs" = $numCPU} try{ $nameVm=get-vm -name $objectVm.name $nameVm.ExtensionData.ReconfigVM_Task($cpuspec) write-host " Modification CPU OK . NbCpu : $numCPU - NbCoeur : $($objectVm.nbCoeur)" Start-Sleep -Seconds 5; return $true } catch{ write-host " - Erreur pendant l'operation de modification des CPU." return $false } } . |
3 – Paramétrage du Réseau
Pendant le déploiement de notre Vm, nous avons configuré les paramètres réseau (IP, DNS..) associé à la carte réseau présente sur notre Template, il ne nous reste donc plus qu’à placer notre VM dans le bon réseau VMWare et si nécessaire dans certain cas à ajouter une seconde carte réseau.
Get-vm -name $objectVm.name | Get-NetworkAdapter | Set-NetworkAdapter -NetworkName $objectVm.reseau1 -Confirm:$false -ErrorAction Stop
Pour configurer l’interface réseau de la VM, on utilise la cmdlet « Set-NetworkAdapter » avec l’option « NetworkName », dont vous pouvez trouver la documentation ici.
Cette cmdlet permet notamment de changer l’adresse mac de la carte, de changer le type de carte (e1000, Flexible, Vmxnet, Vmxnet3, …)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
. try{ # Modification du Réseau get-vm -name $objectVm.name | Get-NetworkAdapter | Set-NetworkAdapter -NetworkName $objectVm.reseau1 -Confirm:$false -ErrorAction Stop write-host " Modification du reseau OK -> $($objectVm.reseau1)" Start-Sleep -Seconds 5; return $true } catch{ ...... message en cas d'erreur..... return $false } . |
Pour créer une nouvelle carte, bien évidemment la commande est du type New-NetworkAdaptater
Get-vm -name $objectVm.name | New-NetworkAdapter -NetworkName $objectVm.reseau2 -Type Vmxnet3 -Confirm:$false -ErrorAction Stop
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
. try{ # Ajout de la 2nd carte Réseau Par défaut en Vmxnet3 get-vm -name $objectVm.name | New-NetworkAdapter -NetworkName $objectVm.reseau2 -Type Vmxnet3 -Confirm:$false -ErrorAction Stop write-host " Ajout 2nd carte reseau OK -> $($objectVm.reseau2)" -color $msg_color_info Start-Sleep -Seconds 5; return $true } catch{ ......mon message en cas d'erreur...... return $false } . |
Voila, nos cartes sont maintenant crées et dans le bon réseau…
4 – Ajout des disques
Les Templates de nos Vms Linux et Windows ont un disque système dimensionné par nos administrateurs systèmes, après de 700 à 800 déploiements, je n’ai jamais eu à modifier la taille, nous avons donc fait de choix de ne pas toucher au disque système dans le script, nous effectuons que des ajouts de disque supplémentaire.
Get-vm -name $objectVm.name | New-HardDisk -CapacityGB $objectVm.disks[$i] -StorageFormat Thin -ErrorAction Stop
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
. $nameVm = get-vm -name $objectVm.name write-host " - Ajout des Disques vm " try{ # On commence à 1 car le template contient déja le disque Systeme # On ne fait qu'ajouter les disques supplementaire, on ne modifie pas # le disque Systeme # for($i=1; $i -lt $objectVm.disks.count; $i++){ $disque="disks$($i+1)" if($objectVm.disks[$i] -gt 0){ write-host "Ajout du disque $i : $($objectVm.disks[$i]) GB" $nameVm | New-HardDisk -CapacityGB $objectVm.disks[$i] -StorageFormat Thin -ErrorAction Stop write-host " Ajout disque OK -> $($disque) $($objectVm.disks[$i]) GB" Start-Sleep -Seconds 2; }else { write-host " Pas de volume disque $i " } } write-host " Ajout des disques OK " return $true } catch{ ... mon message en cas d'erreur... return $false } . |
Notre Vm est Maintenant presque finalisé, il nous reste quelques détails comme les annotations et l’ajout au DRS Group ……
5 – Ajout des annotations
Si vous utilisez les annotations pour annoter vos vms, il faut donc les mettre à jour , pour cela on utilise la cmdlet « set-annotation -customattribute annotation1 ».
Get-vm -name $objectVm.name | Set-annotation -customattribute S_DATECREAT -Value $DateDebut
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
. try{ if($objectVm.dateDebut){ $DateDebut1 = [datetime]::ParseExact($objectVm.dateDebut,'dd/MM/yyyy',$null) $DateDebut = get-Date $DateDebut1 -Format yyy-MM-dd } else{ $DateDebut ="" } # Mise à jour des annotations get-vm -name $objectVm.name | set-annotation -customattribute S_DATECREAT -Value $DateDebut get-vm -name $objectVm.name | set-annotation -customattribute S_TEMPLATE -Value $objectVm.template ........ get-vm -name $objectVm.name | set-annotation -customattribute S_CONTACT -Value $objectVm.contact1 } catch{ ...... Mon message en cas d 'erreur ..... LogAndShow -text $_.Exception.Message -color $msg_color_warning } . |
Les annotations sont maintenant insérées, il ne vous reste plus qu’a placer votre VM dans un DRS-GROUP (enfin, si vous les utilisez….) .
6 – Ajout de la VM à un DRS-Group
Ajouter une vm à un DRS-Group n’était pas si simple jusqu’à la version POWERCLI 6.5.1 . C’est avec cette version que sont apparue toutes les cmdlet nécessaire à la gestion du DRS-GROUP.
-
- Get-DrsClusterGroup
- New-DrsClusterGroup
- Set-DrsClusterGroup
- Remove-DrsClusterGroup
- Get-DrsVMHostRule
- New-DrsVMHostRule
- Set-DrsVMHostRule
- Remove-DrsVMHostRule
vous pouvez lire sur ce sujet l’article du blog.vmware.com
Get-DrsClusterGroup -cluster $myVM.cluster -name $myVM.drsGroup | set-drsclustergroup -vm $($myVM.name) -add -ErrorAction Stop
La commande est assez facile à comprendre, vous récupérer pour un cluster le contenu d’un DRS-Group et vous ajoutez à ce DRS votre nouvelle vm.
1 2 3 4 5 |
. Get-DrsClusterGroup -cluster $myVM.cluster -name $myVM.drsGroup | set-drsclustergroup -vm $($myVM.name) -add -ErrorAction Stop . |
Le déploiement est fini, vous n’avez plus qu’a redémarrer votre serveur .