4 votes

Comment attendre le démarrage/arrêt d'une machine virtuelle dans powershell ?

J'ai ce script powershell que j'appelle pour sauvegarder les machines virtuelles de notre client :

# Author: Vladimir Eremin
# Created Date: 3/24/2015
# http://forums.veeam.com/member31097.html
# 

##################################################################
#                   User Defined Variables
##################################################################

# Names of VMs to backup separated by comma (Mandatory). For instance, $VMNames = “VM1”,”VM2”
$VMNames = "ZIMBRA"

# Name of vCenter or standalone host VMs to backup reside on (Mandatory)
$HostName = "TGDALLAS"

# Directory that VM backups should go to (Mandatory; for instance, C:\Backup)
$Directory = "H:\backups"

# Desired compression level (Optional; Possible values: 0 - None, 4 - Dedupe-friendly, 5 - Optimal, 6 - High, 9 - Extreme) 
$CompressionLevel = "5"

# Quiesce VM when taking snapshot (Optional; VMware Tools are required; Possible values: $True/$False)
$EnableQuiescence = $True

# Protect resulting backup with encryption key (Optional; $True/$False)
$EnableEncryption = $False

# Encryption Key (Optional; path to a secure string)
$EncryptionKey = ""

# Retention settings (Optional; By default, VeeamZIP files are not removed and kept in the specified location for an indefinite period of time. 
# Possible values: Never , Tonight, TomorrowNight, In3days, In1Week, In2Weeks, In1Month)
$Retention = "In3Days"

##################################################################
#                   Notification Settings
##################################################################

# Enable notification (Optional)
$EnableNotification = $True

# Email SMTP server
$SMTPServer = "localhost"

# Email FROM
$EmailFrom = "someone@gmail.com" 

# Email TO
$EmailTo = "some@one.com"

# Email subject
$EmailSubject = "TGDALLAS Backup Status"

##################################################################
#                   Email formatting 
##################################################################

$style = "<style>BODY{font-family: Arial; font-size: 10pt;}"
$style = $style + "TABLE{border: 1px solid black; border-collapse: collapse;}"
$style = $style + "TH{border: 1px solid black; background: #dddddd; padding: 5px; }"
$style = $style + "TD{border: 1px solid black; padding: 5px; }"
$style = $style + "</style>"

##################################################################
#                   End User Defined Variables
##################################################################

#################### DO NOT MODIFY PAST THIS LINE ################
Asnp VeeamPSSnapin

$Server = Get-VBRServer -name $HostName
$MesssagyBody = @()

foreach ($VMName in $VMNames)
{

  Stop-VM -Name $VMNames

  $VM = Find-VBRHvEntity -Name $VMName -Server $Server

  If ($EnableEncryption)
  {
    $EncryptionKey = Add-VBREncryptionKey -Password (cat $EncryptionKey | ConvertTo-SecureString)
    $ZIPSession = Start-VBRZip -Entity $VM -Folder $Directory -Compression $CompressionLevel -DisableQuiesce:(!$EnableQuiescence) -AutoDelete $Retention -EncryptionKey $EncryptionKey
  }

  Else 
  {
    $ZIPSession = Start-VBRZip -Entity $VM -Folder $Directory -Compression $CompressionLevel -DisableQuiesce:(!$EnableQuiescence) -AutoDelete $Retention
  }

  If ($EnableNotification) 
  {
    $TaskSessions = $ZIPSession.GetTaskSessions().logger.getlog().updatedrecords
    $FailedSessions =  $TaskSessions | where {$_.status -eq "EWarning" -or $_.Status -eq "EFailed"}

  if ($FailedSessions -ne $Null)
  {
    $MesssagyBody = $MesssagyBody + ($ZIPSession | Select-Object @{n="Name";e={($_.name).Substring(0, $_.name.LastIndexOf("("))}} ,@{n="Start Time";e={$_.CreationTime}},@{n="End Time";e={$_.EndTime}},Result,@{n="Details";e={$FailedSessions.Title}})
  }

  Else
  {
    $MesssagyBody = $MesssagyBody + ($ZIPSession | Select-Object @{n="Name";e={($_.name).Substring(0, $_.name.LastIndexOf("("))}} ,@{n="Start Time";e={$_.CreationTime}},@{n="End Time";e={$_.EndTime}},Result,@{n="Details";e={($TaskSessions | sort creationtime -Descending | select -first 1).Title}})
  }

  }   

  Start-VM -Name $VMNames

}
If ($EnableNotification)
{
$Message = New-Object System.Net.Mail.MailMessage $EmailFrom, $EmailTo
$Message.Subject = $EmailSubject
$Message.IsBodyHTML = $True
$message.Body = $MesssagyBody | ConvertTo-Html -head $style | Out-String
$SMTP = New-Object Net.Mail.SmtpClient($SMTPServer)
$SMTP.Send($Message)
}

Le problème se situe au niveau du start-vm et du stop-vm. Le script n'attend pas que le vm se soit arrêté ou démarré avant de passer à la ligne suivante.

Comment pourrais-je faire en sorte que mon script cesse de se briser ?

Merci !

longneck

J'ai changé le code en ceci :

  Stop-VM -Name $VMNames
  while ((get-vm -name $vmnames).state -ne 'Running') 
  { 
    $a = Get-Date
    Write-Output "Waiting 5 seconds for $VMName to stop: $a"

    $state = (get-vm -name $vmnames).state
    Write-Output "State: $state"
    start-sleep -s 5 
  }

et j'obtiens ceci :

PS H:\> H:\VeeamBackupZimbra.ps1
Waiting 5 seconds for ZIMBRA to stop: 07/21/2016 14:39:03
State: Off
Waiting 5 seconds for ZIMBRA to stop: 07/21/2016 14:39:08
State: Off
Waiting 5 seconds for ZIMBRA to stop: 07/21/2016 14:39:13
State: Off
Waiting 5 seconds for ZIMBRA to stop: 07/21/2016 14:39:18
State: Off
Waiting 5 seconds for ZIMBRA to stop: 07/21/2016 14:39:23
State: Off

Une boucle sans fin.

Des suggestions ?

1 votes

En fait, vous n'avez rien à faire. Start-VM y Stop-VM n'attendent pas (sauf si vous passez -asjob ).

9voto

longneck Points 22437

Cela attendra que la VM soit en cours d'exécution :

while ((get-vm -name $vmnames).state -ne 'Running') { start-sleep -s 5 }

Et cela attendra que la VM soit éteinte :

while ((get-vm -name $vmnames).state -ne 'Off') { start-sleep -s 5 }

0 votes

Je croyais que ça marchait. Regardez mes notes ci-dessus.

0 votes

Vous avez utilisé la mauvaise ligne. Changez 'Running' a 'Off'

0 votes

Duh. Je n'avais pas pensé à ça. C'est ma faute. Bon travail ! :D

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X