Script for failing over Windows Clusters

This topic contains 0 replies, has 1 voice, and was last updated by  Forums Archives 5 years, 11 months ago.

  • Author
    Posts
  • #5434

    by dmittel at 2013-01-15 08:28:15

    I hope this is getting posted in the right section. The issue I'm having is I'm trying to write a script that I can use to fail over a group of servers and I want to make sure that if the server is already on the preferred node that it will not get failed over. Here is the script that I have:

    Thanks, but I have actually changed up my script a little bit, and now it is breaking at a different place. Maybe you could explain why I am getting the following error. Here is my script:

    import-module failoverclusters

    $i=0
    $clustername = get-content "c:\ClusterName.txt"
    $Oddservers = get-content @("c:\Odds.txt")

    Foreach ($cname in $clustername)
    {
    $PreferredOwner = Get-clusterownernode -cluster $cname -group $oddservers[$i] | select-object -ExpandProperty OwnerNodes -Unique
    $CurrentOwner = get-clustergroup -cluster $cname -name $oddservers[$i] | select-object -ExpandProperty OwnerNode -Unique
    if ($preferredOwner -eq $Currentowner)
    {$i++}
    elseif ($PreferredOwner -ne $CurrentOwner)
    {
    move-clustergroup -cluster $cname -name $Oddservers[$i]
    $i++
    }
    }

    When it runs through the line $CurrentOwner = get-clustergroup -cluster $cname -name $oddservers[$i] | select-object -ExpandProperty OwnerNode -Unique I get the following error on my screen:


    [DBG]>>> Hit Line breakpoint on c:\test_script.ps1:10'
    [DBG]>>> Stopped at: if ($_.FullyQualifiedErrorId -ne "NativeCommandErrorMessage" -and $ErrorView -ne "CategoryView") {
    [DBG]>>> Stopped at: $myinv = $_.InvocationInfo
    [DBG]>>> Stopped at: switch -regex ( & { Set-StrictMode -Version 1; $myinv.MyCommand.CommandType } )
    [DBG]>>> Stopped at: switch -regex ( & { Set-StrictMode -Version 1; $myinv.MyCommand.CommandType } )
    [DBG]>>> Stopped at: switch -regex ( & { Set-StrictMode -Version 1; $myinv.MyCommand.CommandType } )
    [DBG]>>> Stopped at: if ( & { Set-StrictMode -Version 1; $myinv.MyCommand.Name } )
    [DBG]>>> Stopped at: if ( & { Set-StrictMode -Version 1; $myinv.MyCommand.Name } )
    [DBG]>>> Stopped at: if ( & { Set-StrictMode -Version 1; $myinv.MyCommand.Name } )
    [DBG]>>> Stopped at: $myinv.MyCommand.Name + " : "; break;
    [DBG]>>> Stopped at: $myinv.MyCommand.Name + " : "; break;
    [DBG]>>> Stopped at: if ($_.FullyQualifiedErrorId -eq "NativeCommandErrorMessage") {
    [DBG]>>> Stopped at: if ($_.InvocationInfo) {
    [DBG]>>> Stopped at: $posmsg = $_.InvocationInfo.PositionMessage
    [DBG]>>> Stopped at: if ( & { Set-StrictMode -Version 1; $_.PSMessageDetails } ) {
    [DBG]>>> Stopped at: if ( & { Set-StrictMode -Version 1; $_.PSMessageDetails } ) {
    [DBG]>>> Stopped at: if ( & { Set-StrictMode -Version 1; $_.PSMessageDetails } ) {
    [DBG]>>> Stopped at: & { Set-StrictMode -Version 1; $this.Exception.InnerException.PSMessageDetails }
    [DBG]>>> Stopped at: & { Set-StrictMode -Version 1; $this.Exception.InnerException.PSMessageDetails }
    [DBG]>>> Stopped at: & { Set-StrictMode -Version 1; $this.Exception.InnerException.PSMessageDetails }
    [DBG]>>> Stopped at: $indent = 4
    [DBG]>>> Stopped at: $width = $host.UI.RawUI.BufferSize.Width - $indent - 2
    [DBG]>>> Stopped at: $indentString = "+ CategoryInfo : " + $_.CategoryInfo
    [DBG]>>> Stopped at: $posmsg += "`n"
    [DBG]>>> Stopped at: foreach($line in @($indentString -split "(.{$width})")) { if($line) { $posmsg += (" " * $indent + $line) } }
    [DBG]>>> Stopped at: foreach($line in @($indentString -split "(.{$width})")) { if($line) { $posmsg += (" " * $indent + $line) } }
    [DBG]>>> Stopped at: foreach($line in @($indentString -split "(.{$width})")) { if($line) { $posmsg += (" " * $indent + $line) } }
    [DBG]>>> Stopped at: foreach($line in @($indentString -split "(.{$width})")) { if($line) { $posmsg += (" " * $indent + $line) } }
    [DBG]>>> Stopped at: $indentString = "+ FullyQualifiedErrorId : " + $_.FullyQualifiedErrorId
    [DBG]>>> Stopped at: $posmsg += "`n"
    [DBG]>>> Stopped at: foreach($line in @($indentString -split "(.{$width})")) { if($line) { $posmsg += (" " * $indent + $line) } }
    [DBG]>>> Stopped at: foreach($line in @($indentString -split "(.{$width})")) { if($line) { $posmsg += (" " * $indent + $line) } }
    [DBG]>>> Stopped at: foreach($line in @($indentString -split "(.{$width})")) { if($line) { $posmsg += (" " * $indent + $line) } }
    [DBG]>>> Stopped at: foreach($line in @($indentString -split "(.{$width})")) { if($line) { $posmsg += (" " * $indent + $line) } }
    [DBG]>>> Stopped at: if ($ErrorView -eq "CategoryView") {
    [DBG]>>> Stopped at: elseif (! $_.ErrorDetails -or ! $_.ErrorDetails.Message) {
    [DBG]>>> Stopped at: $_.Exception.Message + $posmsg + "`n "
    Get-ClusterGroup : Cannot convert 'test-vps-2008-b' to the type 'System.Collections.Specialized.StringCollection' required by parameter 'Name'. Unable to cast object of type 'System.Management.Automation.PSObject' to type 'System.String'.
    At c:\test_script.ps1:13 char:63
    + $CurrentOwner = get-clustergroup -cluster $cname -name < <<< $oddservers[$i] | select-object -ExpandProperty OwnerNode -Unique
    + CategoryInfo : InvalidArgument: (:) [Get-ClusterGroup], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.FailoverClusters.PowerShell.GetClusterGroupCommand

    Any help would be much appreciated.

    Thanks

    by DonJ at 2013-01-15 14:43:20

    It looks like you have a breakpoint defined. Run Get-PSBreakpoint to check. If it's the [DBG] output you're concerned about.

    The error is because you're passing a PSObject to -Name, but it wants a String collection. In other words, the object in $oddserver[$i] isn't what -Name wants.

    The problem may be how you're wrapping the command in @(). Get-Content already returns an array of strings; you've put that array into another array. Try removing the @().

    by dmittel at 2013-01-15 16:08:28

    Thanks Don, I tried that, but it still did not work. I even tried setting the array into another variable and that is where I see another problem.

    When I tried
    Thanks, but I have actually changed up my script a little bit, and now it is breaking at a different place. Maybe you could explain why I am getting the following error. Here is my script:

    import-module failoverclusters

    $i=0
    $clustername = get-content "c:\ClusterName.txt"
    $Oddservers = get-content "c:\Odds.txt"

    Foreach ($cname in $clustername)
    {
    $Oddservers[$i] = $oserver
    $PreferredOwner = Get-clusterownernode -cluster $cname -group $oserver | select-object -ExpandProperty OwnerNodes -Unique
    $CurrentOwner = get-clustergroup -cluster $cname -name $oserver | select-object -ExpandProperty OwnerNode -Unique
    if ($preferredOwner -eq $Currentowner)
    {$i++}
    elseif ($PreferredOwner -ne $CurrentOwner)
    {
    move-clustergroup -cluster $cname -name $Oddservers[$i]
    $i++
    }
    }

    It wasnt passing the value to the new variable. It didnt matter if wrapped the Get-Content in the @() or not. What else might I be missing?

    by DonJ at 2013-01-15 16:41:31

    What does that text file contain?

    by dmittel at 2013-01-15 22:24:26

    The odds.txt file just contains a list of the nodes:

    test-vps-2008-b
    test-vps-2008-d

    The clusternames.txt file contains a list of the cluters

    c-test-ps-ab
    c-test-ps-dc

You must be logged in to reply to this topic.