Jump to content
Mario-HS

Script für HyperV-Replica Überwachung

Recommended Posts

Hallo allerseits und danke für die Aufnahme, folglich bin ich neu hier.

 

Ich bin Fachinformatiker und beschäftige mich ab und an wenn es die Zeit zuläst mit der PS, also noch ehr Neuling.

Zu meinem Problem. Wir haben etliche HyperV-Hosts im Einsatz und auch HA-Lösungen.

Da HyperV keine Mailbenachrichtigung integriert hat, wollte ich das mit einem script lösen.

Ich ich habe mir folgendes Script zusammen gebastelt und ich habe das Problem, das es nicht in die IF-Anweisung springt, bzw. die Bedingung nicht erfüllt ist/wird.

 

$MailBetreff_Name = (Get-WmiObject Win32_ComputerSystem).Name
$MailBetreff_Domain = (Get-WmiObject Win32_ComputerSystem).Domain
$Mail_Absender = "Admin@_______.de"

$Erstelle_HyperV_Infodatei = Get-VMReplication
$Pruefe_HyperV_Replica_1 = Get-VMReplication -ReplicationHealth "Warning"
$Pruefe_HyperV_Replica_2 = Get-VMReplication -ReplicationHealth "Critical"

$VM_Deltadatein_Pfad1 = "D:\VM"
#$VM_Deltadatein_Pfad2 = ":\VM"
$Info_Datei = "C:\Powershell\HyperV Infodatei.txt"

If ($Pruefe_HyperV_Replica_1 -like $true)
 {
  New-Item $Info_Datei
  $Serverbezeichnung = "Der Replikationstatus von Server: $MailBetreff_Name@$MailBetreff_Domain ist auf WARNUNG gewechselt!" | Out-File $Info_Datei -append
  Get-VMReplication | Out-File $Info_Datei -append
  Get-PSDrive | Out-File $Info_Datei -append
  GCI -Path $VM_Deltadatein_Pfad1 -Recurse -Force | Out-File $Info_Datei -append
  Send-MailMessage –To "HyperV@_____.de" –Subject "HyperV-Replica Warnung" –Body (gc $Info_Datei | Out-String) –SmtpServer "_____.de" –From "$Mail_Absender"
 }
elseif ($Pruefe_HyperV_Replica_2 -Like $True)
 {
  New-Item $Info_Datei
  $Serverbezeichnung = "Der Replikationstatus von Server: $MailBetreff_Name@$MailBetreff_Domain ist auf KRITISCH gewechselt!" | Out-File $Info_Datei -append
  Get-VMReplication | Out-File $Info_Datei -append
  Get-PSDrive | Out-File $Info_Datei -append
  GCI -Path $VM_Deltadatein_Pfad1 -Recurse -Force | Out-File $Info_Datei -append
  Send-MailMessage –To "HyperV@_____.de" –Subject "HyperV-Replica Alarm" –Body (gc $Info_Datei | Out-String) –SmtpServer "_____.de" –From "$Mail_Absender"
 }
else
 {
  Get-Date 
  Write-Host "Alles OK!"
 }

Wenn mir jemand Helfen könnte, wäre das super.

 

 

Mit freundlichen Grüßen

 

Mario

Share this post


Link to post
Share on other sites

Ohne es gerade prüfen zu können, aber ich vermute, das 

Get-VMReplication -ReplicationHealth "Critical"

kein 'true' oder 'false' zurück gibt, sondern einen anderen Wert?

Edited by 4077
Tippfehler

Share this post


Link to post
Share on other sites

Wenn ich die Doku richtig verstehe, liefert es die "Settings" der VM mit dem angegebenen Status. Gib den Befehl doch einfach mal auf der Konsole ein und sieh, was Du als Ausgabe erhältst. Wenn da kein "$true" dabei ist, wird's nix.  ;-) 

Share this post


Link to post
Share on other sites

So sollte es gehen:

$VMReplication = Get-VMReplication | select Name,Health,State

foreach ($vm in $VMReplication) {
	$name = $vm.Name
    if ($vm.Health -Contains "Normal" -and $vm.State -Contains "Replicating") {
		# Mit $name ist alles OK
    }
    elseif ($vm.Health -eq "Warning") {
		# $name hat Warnungen
    }
    elseif ($vm.Health -eq "Critical") {
		# $name hat Fehler
    }
}

Bei Replikationen an externe Standorte mit nicht so hoher Bandbreite toleriere ich im Monitoring ein paar Stunden "Warning", denn das kommt meist, wenn er mit der Replikation nicht nachkommt und Zyklen verpasst. "Critical" ist aber eigentlich immer ein Fehler.

Edited by mwiederkehr

Share this post


Link to post
Share on other sites

Habt ihr kein Monitoring (Icinga, PRTG,...)? Da würde ich dann erstmal da ansetzen und eine integration in das Monitoring erreichen.

Share this post


Link to post
Share on other sites

Mein Beispiel ist ein Ausschnitt aus einem Script, welches von PRTG ausgeführt wird. Eure Beiträge haben mich dazu animiert, wieder mal bei Paessler nachzusehen, ob es mittlerweile einen offiziellen Sensor für die Hyper-V-Replikation gibt. Gibt es nicht, aber sie empfehlen folgendes Script: https://kb.paessler.com/en/topic/50023-monitoring-hyper-v-replication. Dieses hat gegenüber meinem Beispiel den Vorteil, gleich die Minuten seit der letzten erfolgreichen Replikation zurück zu liefern. Es ist eleganter, bei kleinen Bandbreiten eine höhere Zeit zuzulassen als Warnungen zu tolerieren.

  • Like 2

Share this post


Link to post
Share on other sites

Hallo alle zusammen

vor 6 Stunden schrieb mwiederkehr:

So sollte es gehen:


$VMReplication = Get-VMReplication | select Name,Health,State

foreach ($vm in $VMReplication) {
	$name = $vm.Name
    if ($vm.Health -Contains "Normal" -and $vm.State -Contains "Replicating") {
		# Mit $name ist alles OK
    }
    elseif ($vm.Health -eq "Warning") {
		# $name hat Warnungen
    }
    elseif ($vm.Health -eq "Critical") {
		# $name hat Fehler
    }
}

Ich habe es gerade eingearbeitet und es funktioniert ganz wunderbar.

 

Recht herzlichen Dank @mwiederkehr

  • Thanks 1

Share this post


Link to post
Share on other sites

Hallo alle zusammen,

 

da mir hier auch tatkräftig geholfen wurde, möchte ich das fertige Script hier zur Verfügung stellen.

 

Zitat

$MailBetreff_Name = (Get-WmiObject Win32_ComputerSystem).Name
$MailBetreff_Domain = (Get-WmiObject Win32_ComputerSystem).Domain
$Mail_Absender = "Admin@____________.de"

$Mail_Server = "____________"

$Pruefe_HyperV_Replica = Get-VMReplication | select Name,Health,State

$Info_Datei = "C:\Powershell\HyperV Infodatei.txt"
$Log_Datei = "C:\Powershell\HV Logdatei.txt"

$Datum = Get-Date
$VMReplication = Get-VMReplication | select Name,Health,State

 

 $Datum | Out-File $Log_Datei -append
 foreach ($vm in $Pruefe_HyperV_Replica)
  {
   $name = $vm.Name
   if ($vm.Health -Contains "Normal" -and $vm.State -Contains "Replicating")
    {
     "$name  -  Alles OK!" | Out-File $Log_Datei -append
    }
   elseif ($vm.Health -eq "Warning")
    {
     New-Item $Info_Datei
     $Serverbezeichnung = "Der Replikationstatus von Server: $MailBetreff_Name@$MailBetreff_Domain ist auf WARNUNG gewechselt!" | Out-File $Info_Datei -append
     Get-VMReplication | Out-File $Info_Datei -append
     Get-PSDrive | Out-File $Info_Datei -append
     GCI -Path "D:\VM\$name\Virtual Hard Disks" -Recurse -Force | Out-File $Info_Datei -append
     Send-MailMessage –To "______@______.de" –Subject "HyperV-Replica Warnung" –Body (gc $Info_Datei | Out-String) –SmtpServer "$Mail_Server" –From "$Mail_Absender"
     "$name  -  Replikation meldet Warnung!" | Out-File $Log_Datei -append
    }
   elseif ($vm.Health -eq "Critical")
    {
     New-Item $Info_Datei
     $Serverbezeichnung = "Der Replikationstatus von Server: $MailBetreff_Name@$MailBetreff_Domain ist auf KRITISCH gewechselt!" | Out-File $Info_Datei -append
     Get-VMReplication | Out-File $Info_Datei -append
     Get-PSDrive | Out-File $Info_Datei -append
     GCI -Path "D:\VM\$name\Virtual Hard Disks" -Recurse -Force | Out-File $Info_Datei -append
     Send-MailMessage –To "______@______.de" –Subject "HyperV-Replica Alarm" –Body (gc $Info_Datei | Out-String) –SmtpServer "$Mail_Server" –From "$Mail_Absender"
     "$name  -  Kritischer Replikationsstatus!" | Out-File $Log_Datei -append
    }
}
"     " | Out-File $Log_Datei -append
" ----------------------------------------" | Out-File $Log_Datei -append

 

Edited by Mario-HS
  • Thanks 3

Share this post


Link to post
Share on other sites

... nur ein kleiner Tipp, um Deinen Code leichter lesbar zu machen. Bei cmdlets, die ziemlich viele Parameter erfordern oder verdauen, liest sich der Code leichter, wenn man Splatting benutzt ... so ungefähr:

$SendMailProps = @{
    To         = 'empfaenger@maildomain.tld'
    Subject    = 'HyperV-Replica Alarm'
    Body       = Get-Content -Path $Info_Datei | Out-String
    SmtpServer = $Mail_Server
    From       = $Mail_Absender
}
Send-MailMessage @SendMailProps

Hier was zum Nachlesen: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_splatting?view=powershell-7

Edited by BOfH_666
  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites

Huch, oh ja die e-mail habe ich vergessen zu streichen^^.

 

@BOfH_666 danke für denn Tipp, das schau ich mir mal an.

Edited by Mario-HS

Share this post


Link to post
Share on other sites

Einen wunderschönen guten Morgen,

 

ich habe feststellen müssen, dass es einige Probleme mit dem Senden der Mail gibt, und habe daher das Skript noch mal komplett überarbeitet.

Es wäre super wenn die Experten unter euch noch mal drüber schauen können, gerade der Teil mit dem Mailversand ist Neuland für mich, da ich mit Objekterstellung noch nichts gemacht habe.

 

Zitat

$Pruefe_HyperV_Replica = Get-VMReplication | select Name,Health,State

$Info_Datei = "C:\Powershell\HyperV Infodatei.txt"
$Log_Datei = "C:\Powershell\HV Logdatei.txt"

$Datum = Get-Date
$VMReplication = Get-VMReplication | select Name,Health,State

 

##Authentifizierung für Mailserver Anmeldung
$CredUser = "_____"
$CredPassword = ConvertTo-SecureString "_____" -AsPlainText -Force

 

$MailBetreff_Name = (Get-WmiObject Win32_ComputerSystem).Name
$MailBetreff_Domain = (Get-WmiObject Win32_ComputerSystem).Domain

$Datum | Out-File $Log_Datei -append

##Skript Start
 foreach ($vm in $Pruefe_HyperV_Replica)
  {
   $name = $vm.Name
   if ($vm.Health -Contains "Normal" -and $vm.State -Contains "Replicating")
    {
     "$name  -  Alles OK!" | Out-File $Log_Datei -append
    }
   elseif ($vm.Health -eq "Warning") # <-- Schleife für Replikationen mit dem Status Warnung!
    {
     New-Item $Info_Datei
     $Serverbezeichnung = "Der Replikationstatus von Server: $name auf $MailBetreff_Name@$MailBetreff_Domain ist auf WARNUNG gewechselt!" | Out-File $Info_Datei -append
     Get-VMReplication | Out-File $Info_Datei -append
     Get-PSDrive -PSProvider FileSystem | Out-File $Info_Datei -append
     GCI -Path "D:\VM\$name\Virtual Hard Disks" -Recurse -Force | Out-File $Info_Datei -append
##Einstellungen zum Sender der Mail
      $Mail_Absender = "_____@_____"
      $Mail_Empfaenger = "_____@_____e"
      $Mail_Betreff = "HyperV-Replica Warnung"
      $Mail_Body = "(gc $Info_Datei | Out-String)"
      $Mail_Server = "_____"
      $SMTPClient = New-Object Net.Mail.SmtpClient($Mail_Server, 587)
      $SMTPClient.EnableSsl = $true
      $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($CredUser, $CredPassword);
      $SMTPClient.Send($Mail_Absender, $Mail_Empfaenger, $Mail_Betreff, $Mail_Body)
     Send-MailMessage –To "$Mail_Empfaenger" –Subject $Mail_Betreff –Body $Mail_Body –SmtpServer "$Mail_Server" –From "$Mail_Absender"
     "$name  -  Replikation meldet Warnung!" | Out-File $Log_Datei -append
     Remove-Item -Path "C:\Powershell\Info_Datei.txt"
    }
   elseif ($vm.Health -eq "Critical") # <-- Schleife für Replikationen mit dem Status Kritisch!
    {
     New-Item $Info_Datei
     $Serverbezeichnung = "Der Replikationstatus von Server: $name auf $MailBetreff_Name@$MailBetreff_Domain ist auf KRITISCH gewechselt!" | Out-File $Info_Datei -append
     Get-VMReplication | Out-File $Info_Datei -append
     Get-PSDrive -PSProvider FileSystem | Out-File $Info_Datei -append
     GCI -Path "D:\VM\$name\Virtual Hard Disks" -Recurse -Force | Out-File $Info_Datei -append
##Einstellungen zum Sender der Mail
      $Mail_Absender = "_____@_____"
      $Mail_Empfaenger = "_____@_____"
      $Mail_Betreff = "HyperV-Replica Alarm"
      $Mail_Body = "(gc $Info_Datei | Out-String)"
      $Mail_Server = "_____"
      $SMTPClient = New-Object Net.Mail.SmtpClient($Mail_Server, 587)
      $SMTPClient.EnableSsl = $true
      $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($CredUser, $CredPassword);
      $SMTPClient.Send($Mail_Absender, $Mail_Empfaenger, $Mail_Betreff, $Mail_Body)
     Send-MailMessage –To "$Mail_Empfaenger" –Subject $Mail_Betreff –Body $Mail_Body –SmtpServer "$Mail_Server" –From "$Mail_Absender"
     "$name  -  Kritischer Replikationsstatus!" | Out-File $Log_Datei -append
     Remove-Item -Path "C:\Powershell\Info_Datei.txt"
    }
}
"     " | Out-File $Log_Datei -append
" ----------------------------------------" | Out-File $Log_Datei -append

 

Wohltuende Grüsse

Mario

Share this post


Link to post
Share on other sites

Was kommt denn für eine Fehlermeldung?

 

Grundsätzlich kannst Du den (alten?) Weg über die .Net-Klasse "Net.Mail.SmtpClient" gehen oder den neuen über den Befehl "Send-MailMessage", aber nicht beide gleichzeitig.

Share this post


Link to post
Share on other sites

Hallo mwiederkehr,

 

habe nun Folgendes ausprobiert

Zitat

$CredPassword = ConvertTo-SecureString "aaaaa" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential "bbbbb", $CredPassword

 

$Mail_Absender = "Admin@ccccc"
      $Mail_Empfaenger = "1234@5678.de"
      $Mail_Betreff = "HyperV-Replica Alarm"
      $Mail_Body = "(gc $Info_Datei | Out-String)"
      $Mail_Server = "ddddd"
     Send-MailMessage –To "$Mail_Empfaenger" –Subject $Mail_Betreff –Body $Mail_Body –SmtpServer "$Mail_Server" –From "$Mail_Absender" -Port 25 -Credential $cred
    

Ich habe extra "bbbbb" in unseren Mailserver angelegt, der kein SSL benötigt aber das Ergebnis ist folgendermaßen

Zitat

Send-MailMessage : Die Verbindung mit dem Remoteserver kann nicht hergestellt werden.
In Zeile:12 Zeichen:6
+      Send-MailMessage –To "$Mail_Empfaenger" –Subject $Mail_Betreff – ...
+      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.Mail.SmtpClient:SmtpClient) [Send-MailMessage], SmtpException
    + FullyQualifiedErrorId : SmtpException,Microsoft.PowerShell.Commands.SendMailMessage

So recht habe ich noch keine Vermutung was da in den Organisierten Wiederstand getreten ist.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


Werbepartner:



×
×
  • Create New...