Export de VM

De Wiki de Jordan LE NUFF
Sauter à la navigation Sauter à la recherche

Présentation

Cette page a pour objet de décrire le script vmware_export_VM.ps1.

Script

#!/usr/bin/pwsh

<#
.SYNOPSIS
    Script pour exporter une VM depuis le vCenter
.DESCRIPTION
    Au préalable, enregistrer les credentials en lançant le script create_credentials.ps1
.PARAMETER VmName
    Le nom de la VM à exporter. (obligatoire)
.PARAMETER VmExportedName
    Le nom de la VM une fois exportée. (facultatif)
	Valeur par défaut : $VmName
.PARAMETER ExportDir
    Le dossier local dans lequel la VM sera exportée. (facultatif)
	Valeur par défaut : /data/export_vms
.PARAMETER DeleteLocal
    Confirmation de la suppression de la VM locale lors de l'export. (faculatif)
	Valeur possible : No ou Yes
	Valeur par défaut : No
	Si Yes, la VM locale, si elle existe, est supprimée afin de pouvoir réaliser l'export.
	Si No, et que la VM locale n'existe pas, l'export se réalise.
	Si No, et que la VM locale existe, le script se terminera immédiatement sans réaliser l'export.
.EXAMPLE
	./vmware_export_VM.ps1 vm_test vm_template -DeleteLocal Yes
	./vmware_export_VM.ps1 vm_test vm_template -ExportDir /data/export_vms
.NOTES
	Codes erreur :
	0	Tout s'est bien passé
	1	La VM à exporter n'existe pas
	2	La VM à exporter existe plus d'une fois
	
    Author: LE NUFF Jordan
    Date:   Jan 11, 2021
#>

## Définition des paramètres d'entrée
Param
(
	[Parameter(Mandatory=$true, Position=0, HelpMessage="Nom de la VM à exporter")]
	[string]$VmName,
	[Parameter(Mandatory=$false, Position=1, HelpMessage="Nom de la VM une fois exportée")]
	[string]$VmExportedName=$VmName,
	[Parameter(Mandatory=$false, HelpMessage="Dossier d'export de la VM")]
	[string]$ExportDir="/data/export_vms",
	[Parameter(Mandatory=$false, HelpMessage="Confirmation de la suppression de la VM locale : No ou Yes")]
	[ValidateSet('No','Yes')]
	[string]$DeleteLocal='No'
)

## Initialisation variables
# Dossier des identifiants
$CredsFileLocation="/data/scripts/.credentials"
# Adresse IP du vCenter
$UrlVcenter="myvcenter.mydomain.com"
# Identifiant VMware à utiliser
$VmwareUser="myuser@mydomain.com"
# Construction du fichier d'identifiants à utiliser
$VcFileCreds=$($CredsFileLocation + "/" + $UrlVcenter + "_" + $VmwareUser + "_ps.xml")
# Importation des credentials
$VcCreds=Import-Clixml -Path $VcFileCreds

## Connection au VCenter
Connect-VIServer -Server $UrlVcenter -Credential $VcCreds | Out-Null

## Vérifications
# La VM source existe-t-elle ? Si non, fin du script
$vm=Get-VM -name $VmName -ErrorAction SilentlyContinue
If (!$vm){
	Write-Host "La VM $VmName n'existe pas. Fin du script."
	exit 1
} ElseIf ($vm.Count -gt 1) {
	Write-Host "La VM $VmName fournie existe plus d'une fois. VM à exporter ambigüe. Fin du script."
	exit 2
}

# Supprimer les snapshots de la VM
Get-Snapshot $VmName | Remove-Snapshot -confirm:$false

# Extinction de la VM si pas éteinte
If ( $vm.PowerState -ne 'PoweredOff' ) 
{
	$vm = Get-VM $VmName
	$statusGuest = $vm.ExtensionData.Guest.GuestState
	$boottime = $vm.ExtensionData.Runtime.BootTime
	If ($statusGuest -ne 'running' ) {
		do {
			Start-Sleep -s 2
			$vm = Get-VM $VmName
			$statusGuest = $vm.ExtensionData.Guest.GuestState
			$boottime = $vm.ExtensionData.Runtime.BootTime
		} until ($statusGuest -eq "running")
	}
	Shutdown-VMGuest -VM $vm -confirm:$false | Out-Null
	do {
		Start-Sleep -s 2
		$vm = Get-VM $VmName
		$status = $vm.PowerState
		$statusGuest = $vm.ExtensionData.Guest.GuestState
		$boottime = $vm.ExtensionData.Runtime.BootTime
	} until ($status -eq "PoweredOff")
}

# Suppression d'un éventuel ISO présent dans le lecteur CD
$cd = Get-VM -Name $VmName | Get-CDDrive
Set-CDDrive -CD $cd -NoMedia -confirm:$false

# Export de la VM au format OVF (par défaut) ou Ova
If ($DeleteLocal -eq 'No'){
	$task = Export-VApp -VM $VmName -Name $VmExportedName -Destination $ExportDir -RunAsync
} ElseIf ($DeleteLocal -eq 'Yes') {
	$task = Export-VApp -VM $VmName -Name $VmExportedName -Destination $ExportDir -Force -RunAsync
}

Wait-Task -Task $task

# Démarrage de la VM
$task = Start-VM -VM $VmName -confirm:$false -RunAsync
Wait-Task -Task $task

Disconnect-VIServer -Confirm:$false
exit 0