Skip to content

Instantly share code, notes, and snippets.

@rsyuzyov
Created February 10, 2017 16:39
Show Gist options
  • Save rsyuzyov/5143496139b7d7e3d1164c9709111ce3 to your computer and use it in GitHub Desktop.
Save rsyuzyov/5143496139b7d7e3d1164c9709111ce3 to your computer and use it in GitHub Desktop.
Проверка и восстановление репликации виртуальных машин (для планировщика)
# Для работы скрипта необходимо задать переменные:
# $clientname, $hvhosts
#
# В функции отправки почты в техподдержку задать переменные:
# $emailTo, $emailFrom, $password, $smtpServer
#
##############################################################################
#отправка почты в саппорт
function send-email-to-support ([string]$subject, [string]$body)
{
$emailTo = 'email1@gmail.com', 'email2@mail.ru', "email3@outlook.com" # адреса получателей в кавычках через запятую
$emailFrom = 'email4@mail.ru' # адрес отправителя
$password = 'emailpassword' # пароль отправителя
$smtpServer = 'smtp.mail.ru' # smtp сервер отправителя
$secpwd = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential ($emailFrom, $secpwd)
Send-MailMessage -From $emailFrom -Subject $subject -Body $body -To $emailTo -Credential $credential -DeliveryNotificationOption None -Priority High -SmtpServer $smtpServer -UseSsl
}
##############################################################################
cls
$clientname = 'mydomain' #имя клиента для указания в теме письма
$hvhosts = 'host1', 'host2', 'host3' #серверы для проверки
$iserrors = 0 #флаг, индицирующий наличие ошибок
$iswarnings = 0 #флаг, индицирующий наличие предупреждений
$message = '' #переменная для описания ошибок, ничего указывать не надо
foreach ($hvhost in $hvhosts) #делаем обход хостов HV, указаных в массиве $hvhosts
{
Write-Host "Опрос сервера $hvhost`n"
$vms = Get-VM -ComputerName $hvhost #выбираем все ВМ на хосте
foreach($vm in $vms) #делаем обход всех ВМ
{
#Автозапускаемая ВМ не запущена:
If ($vm.ReplicationMode -eq 'Primary' -and $vm.AutomaticStartAction -eq 'Start' -and $vm.State -ne 'Running') #если ВМ не реплика и настроен старт при запуске и не запущена
{
$iserrors = 1
$message = $message + '' + $hvhost + '\' + $vm.Name + ": not started, starting`n"
Start-VM -VM $vm
}
#Критическое состояние репликации
If ($vm.ReplicationHealth -eq 'Critical')
{
$iserrors = 1
$message = $message + "$hvhost\" + $vm.Name + ": replication health is critical (state: " + $vm.ReplicationState + "), resuming`n"
if ($vm.ReplicationState -ne 'Replicating' -and $vm.ReplicationState -ne 'Resynchronizing') #если репликация не работает, попробуем ее возобновить
{
if ($vm.ReplicationState -eq 'WaitingForStartResynchronize')
{
Resume-VMReplication -VM $vm -Resynchronize
}
else
{
Resume-VMReplication -VM $vm
}
}
}
#Предупреждения по состоянию репликации
If ($vm.ReplicationHealth -eq 'Warning')
{
$iswarnings = 1
$message = $message + '' + $hvhost + '\' + $vm.Name + ": replication health is warning (state: " + $vm.ReplicationState + "), reseting state info`n"
if ($vm.ReplicationState -ne 'Replicating' -and $vm.ReplicationState -ne 'Resynchronizing') #если репликация не работает, попробуем ее возобновить
{
Resume-VMReplication -VM $vm
}
else #иначе сбросим статистику
{
Reset-VMReplicationStatistics -VM $vm
}
}
}
}
if ($iserrors -eq 1) #если есть ошибки
{
$subject = "$clientname : Hyper-V errors!"
Write-Host $message
send-email-to-support $subject $message
}
elseif ($iswarnings -eq 1) #если есть предупреждения
{
$subject = "$clientname : Hyper-V warnings!"
Write-Host $message
send-email-to-support $subject $message
}
else #если все в порядке
{
$subject = "$clientname : Hyper-V is ok"
$message = 'All ok'
Write-Host $subject
#send-email-to-support $subject $message
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment