Hallo Gemeinde,
wir haben bei uns ein kleines System mit 2 physischen Hosts (Vsphere 6.0 Essentials mit einem Vcenter als Appliance) und einem physischen Backupserver auf dem Windows 7 Professional (64bit) mit Veeam Backup & Replication 9.5 (Essentials) installiert ist.
Ich möchte gern einen Host als Produktivsystem laufen lassen und den anderen Host als Replikat, der nach dem Backup wieder herunterfährt.
Nun zu meiner Frage:
Wie bekomme ich es hin, dass der Replikat-Host nach dem Backup wieder sauber per Skript herunterfährt?
Auf dem Backup-Server ist VMware vSphere PowerCLI installiert und als Skript habe ich das von Dennis Bistron verwendet und angepasst:
Das Skript PowerCLI_Shutdown.ps1 sieht folgendermaßen aus:
#####################################################################
.#..
# Datei: PowerCLI_Shutdown.ps1
# Autor: Dennis Bistron
# Veröffentlicht: 03. März 2012
# Letzte Änderung: 16. Juli 2012
# Beschreibung: Automatisierter Shutdown von ESX-Hosts
# und VMs.
#
# Weitere Informationen unter:
#
http://blog.bistron.eu/# Keine Gewähr! Nutzung auf eigene Gefahr!
#
#####################################################################
##################################
# config:
$VIServer = "IP des Replikat-Host" # name/ip
$credFile = "" # VICredentialStoreItem
$datacenter = "*" # "DataCenter1","DataCenter2",...
$cluster = "*" # "Cluster1","Cluster2",...
$VMhosts = "IP des Replikat-Host" # "Host1","Host2",...
$shutdownInOrder = $false # $true/$false
$excludedVMs = @("") # @("SRV01","SRV02",...)
$maxWaitVMs = 300 # seconds
$shutdownDelay = 0 # seconds
$testDelay = 1 # seconds
##################################
Write-Host (Get-Date -Format "yyyy-MM-dd HH:mm:ss") *** StartShutdownScript ***
$endVMShutdown = (Get-Date).AddSeconds($maxWaitVMs)
Write-Host (Get-Date -Format "yyyy-MM-dd HH:mm:ss") ConnectVIServer
If($credFile.Equals("")){
Connect-VIServer $VIServer
}
else{
$loginCreds = Get-VICredentialStoreItem -file $credFile
Connect-VIServer -Server $VIServer -User $loginCreds.User -Password $loginCreds.Password
}
# Get ESX Hosts/VMs
Write-Host (Get-Date -Format "yyyy-MM-dd HH:mm:ss") CollectEnvData
#$ESXHosts = Get-Datacenter $datacenter | Get-Cluster $cluster | Get-VMHost $VMhosts # vCenter
$ESXHosts = Get-VMHost # single host
$VMsOnline = $ESXHosts | Get-VM | Where {$_.PowerState -eq "poweredOn"}
$maxVMsOnl = ($VMsOnline | Measure).count
$shutdownOrder = $ESXHosts | Get-VMStartPolicy | Sort-Object -Property @{Expression="StartAction";Descending=$true},@{Expression="StartOrder";Ascending=$shutdownInOrder}
# Shutdown VMs on ESXHosts
Foreach ($VM in $shutdownOrder){
$myVM = $VMsOnline | Where {$_.Name -eq $VM.VM}
# VM running and not excluded from shutdown?
if($myVM.PowerState -eq "PoweredOn"){
if($excludedVMs -notcontains $myVM.Name){
# tools running?
if(($myVM | Get-VMGuest).State -eq "Running"){
# Shutdown VM
Write-Host (Get-Date -Format "yyyy-MM-dd HH:mm:ss") InitShutdown $myVM.Name
$myVM | Shutdown-VMGuest -Confirm:$false
}
else{
# Poweroff VM
Write-Host (Get-Date -Format "yyyy-MM-dd HH:mm:ss") InitPoweroff $myVM.Name
$myVM | Stop-VM -Confirm:$false
}
}
else{
# count excluded VMs online
$cntExclVMs = $cntExclVMs + 1
}
sleep $shutdownDelay
}
}
Write-Host (Get-Date -Format "yyyy-MM-dd HH:mm:ss") ExcludedVMsOnl $cntExclVMs
# Wait for VM power off
$tmpVMsOnl = $maxVMsOnl
Do {
$VMsStillOnline = $ESXHosts | Get-VM | Where { $_.PowerState -eq "poweredOn" }
$cntVMsOnl = ($VMsStillOnline | Measure).count
$tmWait = ($endVMShutdown - (Get-Date))
Write-Host (Get-Date -Format "yyyy-MM-dd HH:mm:ss") Waiting $tmpVMsOnl/$maxVMsOnl VMs online / $tmWait left...
# any VM powered off?
if($cntVMsOnl -ne $tmpVMsOnl){
If($VMsStillOnline){
Foreach ($VM in (Compare-Object $VMsStillOnline $VMsOnline)){
Write-Host (Get-Date -Format "yyyy-MM-dd HH:mm:ss") PoweredOff $VM.InputObject
}
$VMsOnline = $VMsStillOnline
$tmpVMsOnl = ($VMsOnline | Measure).count
}else{
Foreach ($VM in ($VMsOnline)){
Write-Host (Get-Date -Format "yyyy-MM-dd HH:mm:ss") PoweredOff $VM.Name
$tmpVMsOnl = 0
}
}
}
if($tmpVMsOnl -ne (0 + $cntExclVMs)){sleep $testDelay}
} until ($tmpVMsOnl -eq (0 + $cntExclVMs) -or $tmWait -le 0)
# List VMs shutdown with host
if($tmpVMsOnl -ne 0){
Foreach($VM in $VMsOnline){
if($excludedVMs -notcontains $VM.Name){$marker = "!"}else{$marker = ""}
Write-Host -NoNewline (Get-Date -Format "yyyy-MM-dd HH:mm:ss") $marker
Write-host StillPoweredOn $VM.Name
}
}
# Shutdown ESXHosts
Foreach($ESXHost in $ESXHosts){
Write-Host (Get-Date -Format "yyyy-MM-dd HH:mm:ss") InitShutdown $ESXHost.Name
$ESXHost | Foreach {Get-View $_.ID} | Foreach {$_.ShutdownHost_Task($TRUE)}
}
Write-Host (Get-Date -Format "yyyy-MM-dd HH:mm:ss") *** EndShutdownScript ***
Dieses Skript wollte ich im Anschluß zur Backup-Aufgabe per Batchdatei Shutdown.bat ausführen lassen:
Die Batchdatei Shutdown.bat hat folgenden Inhalt:
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -PSConsoleFile "C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\vim.psc1" "& "C:\Shutdown\PowerCLI-Shutdown.ps1"
Geht aber leider nicht.
Muss ich noch irgendeinen Dienst ausführen lassen um das Powershell-Skript zum Laufen zu bringen?
Wenn ich die Batchdatei direkt im Explorer ausführe, so klappt es nicht. Führe ich hingegen das Skript PowerCLI-Shutdown.ps1 in der Konsole vom VMware vSphere PowerCLI aus, so fährt der Replikat-Host wie gewünscht herunter.
Vielen Dank für Eure Hilfe
Thomas
Statistik: Verfasst von albiderbaer — 13.02.2017, 11:15