Jump to content

Script für HyperV-Replica Überwachung


Direkt zur Lösung Gelöst von mwiederkehr,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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

Link zu diesem Kommentar
  • Beste Lösung

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.

bearbeitet von mwiederkehr
Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

 

bearbeitet von Mario-HS
Link zu diesem Kommentar

... 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

bearbeitet von BOfH_666
  • Like 1
  • Danke 1
Link zu diesem Kommentar
  • 2 Wochen später...

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

Link zu diesem Kommentar

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.

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...