PowerCli - Mise à jour du VMX de templates de machines virtuelles
Overview
Lorsqu'on gère plusieurs centaines de machines virtuelles, templates, virtual-appliance etc., on a pas spécialement envie de se palucher à la main, les opérations de mises-à-jour systématiques. En plus si vous cotoyez des gus comme @fdibot, ça devient carrément un sacrilège d'envisager de faire à la main ce genre d'opération, si vous avez la possibilité de le scripter en powershell.
Si on travaille sur un environnement Windows et VMware, l'API "PowerCli" est une facilité appréciable qui permet d'automatiser des tâches fastidieuses à réaliser à la main sur votre infrastructure vSphere. Le dernier exemple en date a été une demande pour modifier, rapidement, les paramètres VMX de templates de machines virtuelles. Or si la lecture de la configuration VMX d'une VM ou d'un template est aisée, l'écriture de modifications sur un template nécessite une petite pirouette que j'explique ici.
Étape par étape
Se connecter à vCenter
C'est l'étape la plus simple et la plus documentée sur Internet. Tout commence par l'ajout à votre contexte, du module adéquat qui va vous permettre d'utiliser l'extension PowerCli
:
# load PowerCli Snapin
if ((Get-PSSnapin -Name VMware.Vimautomation.Core -ErrorAction SilentlyContinue) -eq $null ) {
Add-PsSnapin VMware.Vimautomation.Core
}
Ensuite on se connecte à notre vCenter Server préféré:
# vCenter server
$VC = "monvcenter.domain.tld"
$Username = "domain\monuser"
# connecting vCenter
$Credentials = get-credential -credential $Username
Connect-VIServer -server $($VC.IP) -Credential $Credentials
Préparer la configuration à mettre en place
Les paramètres d'un fichier VMX sont simplement composés d'un couple clé/valeur. Le type d'objet requis est VMware.Vim.optionvalue
, le tout ajouté à un type d'objet correspondant à la configuration (même partielle) d'une VM: VMware.Vim.VirtualMachineConfigSpec
.
# config change for updateVMWareTools
$vmConfigSpec = New-Object VMware.Vim.VirtualMachineConfigSpec
$vmConfigSpec.extraconfig += New-Object VMware.Vim.optionvalue
$vmConfigSpec.extraconfig[0].Key="isolation.tools.guestInitiatedUpgrade.disable"
$vmConfigSpec.extraconfig[0].Value="false"
Ici on va placer à "vrai" toutes les valeurs (déjà existantes ou pas) de isolation.tools.guestInitiatedUpgrade.disable
(ce qui permettra de lancer la mise à jour des VMwareTools d'une machine, depuis l'OS de la VM).
Appliquer cette modification aux templates
Dans le cas figure présenté ici, on ne va pas filtrer les templates sur lesquels appliquer ce changement de configuration. Il est toutefois envisageable de placer un filtre (via | filter
) ou de placer des tests if
pour, par exemple, ne sélectionner que les templates dont le GuestOS
déclaré est de type Windows.
# update all templates
$templates = Get-template
foreach ($tpl in $templates) {
Write-host -foreground blue "Template: $($tpl.Name)"
Write-host -foreground gray " Converting to VM"
$vm = **Set-Template -Template $tpl -ToVM**
Write-host -foreground gray " updating VMX"
($vm | Get-View).ReconfigVM($vmConfigSpec)
Write-host -foreground gray " Converting to Template back"
**($vm | Get-View).MarkAsTemplate()** | Out-Null
Write-host -foreground gray "End of update process"process
}
L'astuce, si on peut appeler ça ainsi, est de réaliser la séquence suivante pour chaque template:
- conversion en machine virtuelle
- mise à jour du VMX
- conversion en template
C'est moche mais c'est rapide et ça fait bien le job.
Quand c'est terminé
On se déconnecte:
# clean leave
Disconnect-VIServer -Confirm:$false
That's all folks !
La version complète
La version complète du script présenté ici est disponible ici: lrivallain (sur Github) / TemplatesVmxUpdater.ps1
Et si certains ont trouvé plus rapide et moins sale, les commentaires sont là pour ça.