TUTOS.EU

Arrêter une VM, snapshot, restart puis une commande

Commenter arrêter une VM de VMWare, faire un snapshot, la redémarrer et exécuter une commande

Ce script PowerShell permet d'arrêter une VM de façon soft via les VMTools, d'en faire un SnapShot, de la redémarrer et de passer éventuellement une commande à faire exécuter à la VM.

La liste des machines à traiter est fournie via un fichie texte.

La variable à renseigner est la suivante :

$EmplacementFichier = "C:\Chemin_Liste_VM.txt"

Comme vous le constatez le nom et l'emplacement du ficher par défaut est C:\Chemin_Liste_VM.txt

Le script a été réalisé avec l'interface de programmation PowerGUI.

Comme c'est un script qui se connecte aux infrastructures virtuelles de VMWare, il vous faudra télécharger et installer au préalable PowerCli.

Pour cela il vous faudra un compte (gratuit) chez VMWare.

Syntaxe à utiliser pour lancer le script

Powershell -command "c:\NomScriptPowerShell.ps1" -v NomVm
Lien vers le fichier : cliquez ici Copier le code

Le script

Clear-Host

param  
(  
   [string]$VIserver,
   [string]$VILogin,
   [string]$VIMotdepasse,
   [string]$VMName,
   [string]$varErrorCount,
   [switch]$verbose,
   [switch]$debug 
)  

Clear-Host

#Definition de 2 variables globales
$global:MyVar01 = ""
$global:MyVar02 = ""

$VIserver = "Nom vCenter"
$VILogin = "domaine\login" #Domaine\login avec droits de connexion au vCenter
$VIMotdepasse = "YourPassword" #Mot de passe pour connexion au vCenter

$VMLogin = "LoginCompteLocalDeLaVM"
$VMMotdepasse = "MotDePasseLocalSurVM"

function main()  
{  
	asnp vmware* #Import modules VMWares
	$ErrorActionPreference = "Continue" 
	if ($verbose) {$VerbosePreference = "Continue"}  
	if ($debug) {$DebugPreference = "Continue"}
	
	$DebugPreference = "SilentlyContinue"

	CheckVIToolKit
	Connect-VIServer -Server $VIserver -User $VILogin -Password $VIMotdepasse

	Write-Host "Traitement de $VMName"
	$UneVM = Get-VM -Name $VMName

	Write-Host $UneVM.PowerState #Juste pour afficher si la VM est allumée ou non
	$Error.Clear()

	Write-Host "Traitement de $VMName"
	$UneVM = Get-VM -Name $UneLigne
	$toolsstatus = $vmview.Guest.ToolsStatus
	Write-Host "$VMName : Tools status : $toolsstatus"

	Write-Host $UneVM.PowerState
	if ($UneVM.PowerState -eq "PoweredOn") {
		Write-Host "Shutdown guest de $VMName"
		Shutdown-VMGuest -VM $UneVM -Confirm:$false		
	}

	while ($UneVM.PowerState -eq "PoweredOn") {
		sleep 4
		$UneVM = Get-VM -Name $VMName #On est obligé de refaire un Get-VM sur la machine pour avoir un statut de PowerState à jour. C'est très con.
		Write-Host $UneVM.PowerState
	}
	Write-Host "$VMName est bien arrêté"
	
	Write-Host "$VMName : Création d'un snapshot"
	New-Snapshot -Name "SnapShot via PowerShell" -Description "PowerShell"  -VM $UneVM #-RunAsync

	Write-Host "$VMName : Démarrage de la VM $VMName"
	Start-VM -VM $UneVM

	while ($UneVM.PowerState -ne "PoweredOn") {
		Write-Host "La Vm $VMName n'est pas encore allumée. Attente de 4 secondes"
		sleep 4
		$UneVM = Get-VM -Name $VMName #On est obligé de refaire un Get-VM sur la machine pour avoir un statut de PowerState à jour. C'est très con.
		Write-Host $UneVM.PowerState
	}

	#Attente tant que l'on n'arrive pas à contacter les VMTools
	write-host "Attente de la disponibilité des VMTools"
	do {
		$toolsStatus = (Get-VM $UneVM | Get-View).Guest.ToolsStatus
		write-host $toolsStatus
		sleep 3
	} until ( $toolsStatus -eq ‘toolsOk’ )
	Write-Host "Tools de $VMName Ok"

	#Attente de la possibilité du lancement d'une commande auprès des VMTools
	write-host "Test de lancement d'une commande via les VMTools"
	write-host "Ce test echoue a chaque fois si le login et mdp est faux donc attention"
	do {
		sleep 10
		$Error.Clear()
		$Mycommand = "dir.exe"
		
		Invoke-VMScript -ScriptText $Mycommand -VM $UneVM -ScriptType Bat -GuestUser $VMLogin -GuestPassword $VMMotdepasse
		$varErrorCount = [string]$($Error.Count)
		write-host "Error count : $($Error.Count)"
		write-host "varErrorCount : $varErrorCount"
	} while ($varErrorCount -ne "0")
	
	write-host "$VMName est maintenant allumee et les VMTools peuvent executer une commande"

}  

function CheckVIToolKit()  
{  
    ## Before we do anything we must check to see if the user has the VI toolkit installed.  
    ## If user does not then we prompt the user and exit.  
    $Error.Clear()  
    Get-PSSnapin vmware*  
    if($Error.Count -ne 0)  
    {  
        Clear-Host  
        Write-Host "`n`n`t`t ERROR - To run this script, the VI Toolkit must be installed and registered with Powershell. If the VI Tollkit is installed," -foregroundcolor red -backgroundColor yellow  
        Write-Host "`t`t go to the Settings menu in Powershell Plus and click on Manage Snapins." -foregroundcolor red -backgroundColor yellow  
#        Read-Host  "`n`n`t Press <Enter> to continue."  
        break  
    }  

}## EOF: CheckVIToolKit()

Function ParseCommand($oArgs){

	#Parses the command line and fills the script variables 
	#with the appropriate values.

#	$test = "-n,test"
#	$oArgs = $test.split(",")
	$ArgCount = 0
	if (!$oArgs.length -gt 0){
		write-host "No arguments specified."
	}

	While ($ArgCount -lt $oArgs.length){
		switch ($oArgs[$ArgCount].ToLower()){
			"-v"{
				$global:MyVar01 = $oArgs[($ArgCount+1)]
				$ArgCount = ($ArgCount + 2)
				write-host "-v : $MyVar01"
			}

			default{
				write-host "Invalid command."
#				Help
				exit			
			}
		}
	}
}

#Parse commands
ParseCommand($args)

$VMName = $MyVar01
write-host "VMName : $VMName"

## Run Main
main
Lien vers le fichier : cliquez ici Copier le code

Ci-dessous à peut prêt le même script powershell à la nuance que celui-ci est lancé via un script VbScript qui pose des questions et envoie les réponses au script Powershell via des paramètres.

Le VbScript :

Option Explicit

Dim CheminScriptActuel, ScriptFileName, Position
Dim WSHShell, Commande
Dim NomVM, varLoginAuthentVM, varMotDePasseAuthentVM, varNomSnapShot
Dim objFSO, objTextFile, CheminFichierLog

'Déclaration des constantes
Const ForReading = 1
Const ForWritting = 2
Const ForAppending = 8


CheminScriptActuel = Left(wscript.scriptfullname,Len(wscript.scriptfullname)-Len(wscript.scriptname)-1)
'Wscript.Echo "Votre script '" & wscript.scriptname & "' est dans le répertoire '" & CheminScriptActuel & "'."

ScriptFileName = wscript.scriptname
Position = InstrRev(ScriptFileName,".")
if (Position > 0) Then ScriptFileName = Left(ScriptFileName, Position - 1)

CheminFichierLog = CheminScriptActuel & "\" & ScriptFileName & "_log.txt"

NomVM = Trim(InputBox("Entrez le nom de la VM","Nom de la VM","NomVM"))
varLoginAuthentVM = Trim(InputBox("Entrez le login qui sera utilisé pour s'authentifier sur la VM","Login","Administrator"))
varMotDePasseAuthentVM = Trim(InputBox("Entrez le mot de passe associé","Mot de passe","Password"))
varNomSnapShot = Trim(InputBox("Entrez le nom du snapshot","Nom du snapshot","Snapshot via Powershell"))

If Len(NomVM) > 0 Then
	Set WSHShell = CreateObject("WScript.Shell")

	Commande = "cmd /k Powershell -file """ & CheminScriptActuel & "\" & ScriptFileName & ".ps1"" -v """ & NomVM & """ -loginvm """ & varLoginAuthentVM & """ -mdpvm """& varMotDePasseAuthentVM & """ -nomsnap """ & varNomSnapShot & """"
	msgbox Commande

	Set objFSO = CreateObject("Scripting.FileSystemObject")
	Set objTextFile = objFSO.OpenTextFile(CheminFichierLog, ForWritting, True)
	objTextFile.WriteLine(Commande) 'On ecrit la date et l'heure dans le fichier
	objTextFile.Close 'Fermeture du fichier

	Set objTextFile = Nothing
	Set objFSO = Nothing
	
	WSHShell.Run Commande
	Set WSHShell = Nothing
End If





Lien vers le fichier : cliquez ici Copier le code

Le script powershell :

Clear-Host

$VIserver = "NomvCenter"
$VILogin = "domaine\loginvCenter"
$VIMotdepasse = "MotDePassevCenter"

#Definition des variables globales
$global:varNomVM = ""
$global:varVMLogin = ""
$global:varVMMotdepasse = ""
$global:varNomSnapshot = ""


function main()  
{  
	asnp vmware* #Import modules VMWares
	$ErrorActionPreference = "Continue" 
	if ($verbose) {$VerbosePreference = "Continue"}  
	if ($debug) {$DebugPreference = "Continue"}
	
	$DebugPreference = "SilentlyContinue"

	CheckVIToolKit
	Connect-VIServer -Server $VIserver -User $VILogin -Password $VIMotdepasse

	Write-Host "Traitement de $varNomVM"
	$UneVM = Get-VM -Name $varNomVM

	Write-Host $UneVM.PowerState #Juste pour afficher si la VM est allumée ou non
	$Error.Clear()

	Write-Host "Traitement de $varNomVM"
	$UneVM = Get-VM -Name $UneLigne
	$toolsstatus = $vmview.Guest.ToolsStatus
	Write-Host "$varNomVM : Tools status : $toolsstatus"

	Write-Host $UneVM.PowerState
	if ($UneVM.PowerState -eq "PoweredOn") {
		Write-Host "Shutdown guest de $varNomVM"
		Shutdown-VMGuest -VM $UneVM -Confirm:$false		
	}

	while ($UneVM.PowerState -eq "PoweredOn") {
		sleep 4
		$UneVM = Get-VM -Name $varNomVM #On est obligé de refaire un Get-VM sur la machine pour avoir un statut de PowerState à jour. C'est très con.
		Write-Host $UneVM.PowerState
	}
	Write-Host "$varNomVM est bien arrêté"
	
	Write-Host "$varNomVM : Création d'un snapshot"
	New-Snapshot -Name $varNomSnapshot -Description $varNomSnapshot  -VM $UneVM #-RunAsync

	Write-Host "$varNomVM : Démarrage de la VM $varNomVM"
	Start-VM -VM $UneVM

	while ($UneVM.PowerState -ne "PoweredOn") {
		Write-Host "La Vm $varNomVM n'est pas encore allumée. Attente de 4 secondes"
		sleep 4
		$UneVM = Get-VM -Name $varNomVM #On est obligé de refaire un Get-VM sur la machine pour avoir un statut de PowerState à jour. C'est très con.
		Write-Host $UneVM.PowerState
	}

	#Attente tant que l'on n'arrive pas à contacter les VMTools
	write-host "Attente de la disponibilité des VMTools"
	do {
		$toolsStatus = (Get-VM $UneVM | Get-View).Guest.ToolsStatus
		write-host $toolsStatus
		sleep 3
	} until ( ($toolsStatus -eq ‘toolsOk’) -or ($toolsStatus -eq ‘toolsOld’))
	Write-Host "Tools de $varNomVM Ok"

	# #Attente de la possibilité du lancement d'une commande auprès des VMTools
	# write-host "Test de lancement d'une commande via les VMTools"
	# write-host "Ce test echoue a chaque fois si le login et mdp est faux donc attention"
	# do {
		# sleep 10
		# $Error.Clear()
		# $Mycommand = "dir.exe"
		
		# Invoke-VMScript -ScriptText $Mycommand -VM $UneVM -ScriptType Bat -GuestUser $varVMLogin -GuestPassword $varVMMotdepasse
		# $varErrorCount = [string]$($Error.Count)
		# write-host "Error count : $($Error.Count)"
		# write-host "varErrorCount : $varErrorCount"
	# } while ($varErrorCount -ne "0")
	
	# write-host "$varNomVM est maintenant allumee et les VMTools peuvent executer une commande"

	Write-Host "Mise à jour des VMTools"
	#Monter une ISO sur le CD
	$DatastoreName = "[031-SVC-P315]"
	$isopath = "_ISO/VMTOOLS_55U2/VMware-tools-windows-9.4.10-2092844.iso"
	$FullIsoPath = "$DatastoreName $isopath"		
	
	$MyCd = get-cddrive -VM $UneVM | set-cddrive -IsoPath $FullIsoPath -Connected $true -Confirm:$false
	
	$DriveLetter = "D:"
	$ScriptText = "$DriveLetter\setup64.exe /S /v `"/qn REBOOT=R ADDLOCAL=ALL REMOVE=Hgfs,WYSE`""
	Invoke-VMScript -VM $UneVM -ScriptText $ScriptText -ScriptType bat -GuestUser $VMLogin -GuestPassword $VMMotdepasse

	#Démonter l'ISO
	Set-CDDrive -CD $MyCd -NoMedia -Confirm:$false #Disconnect the ISO
	sleep 10
		
}  

function CheckVIToolKit()  
{  
    ## Before we do anything we must check to see if the user has the VI toolkit installed.  
    ## If user does not then we prompt the user and exit.  
    $Error.Clear()  
    Get-PSSnapin vmware*  
    if($Error.Count -ne 0)  
    {  
        Clear-Host  
        Write-Host "`n`n`t`t ERROR - To run this script, the VI Toolkit must be installed and registered with Powershell. If the VI Tollkit is installed," -foregroundcolor red -backgroundColor yellow  
        Write-Host "`t`t go to the Settings menu in Powershell Plus and click on Manage Snapins." -foregroundcolor red -backgroundColor yellow  
#        Read-Host  "`n`n`t Press <Enter> to continue."  
        break  
    }  

}## EOF: CheckVIToolKit()

Function ParseCommand($oArgs){

	#Parses the command line and fills the script variables 
	#with the appropriate values.

#	$test = "-n,test"
#	$oArgs = $test.split(",")
	$ArgCount = 0
	if (!$oArgs.length -gt 0){
		write-host "No arguments specified."
	}

	While ($ArgCount -lt $oArgs.length){
		switch ($oArgs[$ArgCount].ToLower()){
			"-v"{
				$global:varNomVM = $oArgs[($ArgCount+1)]
				$ArgCount = ($ArgCount + 2)
				write-host "-v : $varNomVM"
				break
			}

			"-loginvm"{
				$global:varVMLogin = $oArgs[($ArgCount+1)]
				$ArgCount = ($ArgCount + 2)
				write-host "-loginvm : $varVMLogin"
				break
			}
			
			"-mdpvm"{
				$global:varVMMotdepasse = $oArgs[($ArgCount+1)]
				$ArgCount = ($ArgCount + 2)
				write-host "-mdpvm : $varVMMotdepasse"
				break
			}			
			
			"-nomsnap"{
				$global:varNomSnapshot = $oArgs[($ArgCount+1)]
				$ArgCount = ($ArgCount + 2)
				write-host "-nomsnap : $varNomSnapshot"
				break
			}

			default{
				write-host "Invalid command."
#				Help
				exit			
			}
		}
	}
}

#Parse commands
ParseCommand($args)

## Run Main
main
Lien vers le fichier : cliquez ici Copier le code

Pages Web

Site WebDescription
PowerCLI : Connect-VIServer commandAide de la commande Connect-VIServer
Getshifting.com - scriptScript pour un upgrade VMTools et Hardware

Téléchargement(s)

NomSite Web d origineDescription
VMware-PowerCLI-5.1.0-793... https://my.vmware.com/fr/web/v... vSphere PowerCli


2