The following script provide how to perform failover to the DAG Listener with multiple IP Address from different Subnets.
Some clienst like "Reporting Services" does not support a DAG Listener with the value multisubnet=true.
So the script will get the Listener address on the Reporing Services configuration and also the instance. After that it will check that address on dns using a nslookup cmd.
After that we will get all ip address configured using the A name of Listener.
Using each address we can check how has services, if the ip that is providing services, the scrip will check it and change for the new ip that has service sending an email with the notification.
Regards and I hope you find this useful.
PowerShell
Edit|Remove
[int]$pingfail 
[bool]$whilescape = $false 
$ErrorMessage 
$getRepoInstace = (Get-WmiObject -namespace root\Microsoft\SqlServer\ReportServer  -class __Namespace -ComputerName localhost).name 
$getReportServerConfig = Get-WmiObject -namespace root\Microsoft\SqlServer\ReportServer\$getRepoInstace\v13\Admin -class MSReportServer_ConfigurationSetting 
$vlnaddress = ($getReportServerConfig.DatabaseServerName -replace (", 1533""")).toUpper() 
#only for tests $vlnaddress = ("vln104000.dir.svc.dominiobigote.com").toUpper() 
$addresses = (Resolve-DnsName -Name $vlnaddress -DnsOnly).IPAddress 
$bodyMessageFailOverTableHeader 
$ServiceFileName = "c:\temp\FAILOVER-Check.html" 
$ServerPath = "C:\Windows\System32\drivers\etc\hosts" 
 
if(Get-Content -Path $ServerPath | where{$_ -match $vlnaddress}) 
{ 
} 
else{ 
    $addtoHostFileIfNotExist = get-random $addresses -Count 1 
     
    Add-Content -Path $ServerPath -Value ("`r`n"+$addtoHostFileIfNotExist+"`t"+$vlnaddress-Force 
} 
 
if(test-path $ServiceFileName) 
{ 
    Remove-Item $ServiceFileName -Force 
} 
else 
{ 
    New-Item -ItemType file $ServiceFilename -Force 
} 
 
if(!(test-path $ServerPath)) 
{ 
    New-Item -ItemType file $ServiceFilename -Force 
} 
 
 
$attachment = Get-Item .\JE_logo.png 
 
$bodyimg = '<img src="{0}" />' 
 
$mailParams = @{     
    From = 'FailOver.ReportingServices@dominiobigote.com' 
    To = @('m@dominiobigote.com','j.a@dominiobigote.com','pa@dominiobigote.com','na@dominiobigote.com','oscar@dominiobigote.com','hernan.pz@dominiobigote.com') 
    #To = 'santiago.e.ventura@dominiobigote.com' 
    SmtpServer = 'apaint.smtp.dominiobigote.com' 
    Subject = "" 
    BodyAsHTML = $true 
    Attachments = $attachment.FullName 
    Body = "" 
    Priority = "High" 
    Encoding = ([System.Text.Encoding]::UTF8) 
} 
 
Function writeFailOverHTMLHeader  
{ 
    param($ServiceFileName) 
 
    Add-Content -Path $ServiceFileName "<html>" 
    Add-Content -Path $ServiceFileName "<head>" 
    Add-Content -Path $ServiceFileName "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>" 
    Add-Content -Path $ServiceFileName "<title>MMM DevOps FailOver Reporting Services Automation - FAILOVER Check</title>" 
    Add-Content -Path $ServiceFileName "<STYLE TYPE='text/css'>" 
    Add-Content -Path $ServiceFileName "<!--" 
    Add-Content -Path $ServiceFileName "td {" 
    Add-Content -Path $ServiceFileName "font-family: Calibri;" 
    Add-Content -Path $ServiceFileName "font-size: 16px;" 
    Add-Content -Path $ServiceFileName "border-top: 1px solid #999999;" 
    Add-Content -Path $ServiceFileName "border-right: 1px solid #999999;" 
    Add-Content -Path $ServiceFileName "border-bottom: 1px solid #999999;" 
    Add-Content -Path $ServiceFileName "border-left: 1px solid #999999;" 
    Add-Content -Path $ServiceFileName "padding-top: 0px;" 
    Add-Content -Path $ServiceFileName "padding-right: 0px;" 
    Add-Content -Path $ServiceFileName "padding-bottom: 0px;" 
    Add-Content -Path $ServiceFileName "padding-left: 0px;" 
    Add-Content -Path $ServiceFileName "white-space: nowrap;" 
    Add-Content -Path $ServiceFileName "}" 
    Add-Content -Path $ServiceFileName "body {" 
    Add-Content -Path $ServiceFileName "margin-left: 5px;" 
    Add-Content -Path $ServiceFileName "margin-top: 5px;" 
    Add-Content -Path $ServiceFileName "margin-right: 0px;" 
    Add-Content -Path $ServiceFileName "margin-bottom: 10px;" 
    Add-Content -Path $ServiceFileName "" 
    Add-Content -Path $ServiceFileName "table {" 
    Add-Content -Path $ServiceFileName "border: thin solid #000000;" 
    Add-Content -Path $ServiceFileName "}" 
    Add-Content -Path $ServiceFileName "p {" 
    Add-Content -Path $ServiceFileName "font-family: Calibri;" 
    Add-Content -Path $ServiceFileName "font-size: 11px;" 
    Add-Content -Path $ServiceFileName "}" 
    Add-Content -Path $ServiceFileName "-->" 
    Add-Content -Path $ServiceFileName "</style>" 
    Add-Content -Path $ServiceFileName "</head>" 
    Add-Content -Path $ServiceFileName "<body>" 
    Add-Content -Path $ServiceFileName "<h1 align='center'>############ THIS IS A TEST NO FAILOVER PERFORMED ############</h1><br>" 
    Add-Content -Path $ServiceFileName "<h1 align='center'>MMM DevOps FailOver Reporting Services Automation</h1>" 
 
} 
 
Function writeFailOverTableHeader 
{ 
    param($ServiceFileName) 
     
    Add-Content -Path $ServiceFileName "<table align='center'>" 
    Add-Content -Path $ServiceFileName  "<tr bgcolor=#CCCCCC>" 
    Add-Content -Path $ServiceFileName  "<td colspan='4' align='center'>" 
    Add-Content -Path $ServiceFileName  "<font face='calibri' color='#003399' size='4'><strong>MMM DevOps FailOver Reporting Services Automation - FAILOVER Check - Date: $GetDate<strong></font>" 
    Add-Content -Path $ServiceFileName  "</td>" 
    Add-Content -Path $ServiceFileName  "</tr>" 
    Add-Content -Path $ServiceFileName "<tr bgcolor=#CCCCCC>" 
    Add-Content -Path $ServiceFileName "<td align='center'>VLNAddress</td>" 
    Add-Content -Path $ServiceFileName "<td align='center'>From</td>" 
    Add-Content -Path $ServiceFileName "<td align='center'>To</td>" 
    Add-Content -Path $ServiceFileName "<td align='center'>Status</td>" 
    Add-Content -Path $ServiceFileName "</tr>" 
} 
 
Function writeFailOverTable 
{ 
    param($ServiceFileName,$vlnaddress,$fromip,$toip,$FailOverStatus) 
     
    Add-Content -Path $ServiceFileName "<tr>" 
    Add-Content -Path $ServiceFileName "<td bgcolor='#b1ffb1' align=center>$vlnaddress</td>" 
    Add-Content -Path $ServiceFileName "<td bgcolor='#ffb1b1'>$fromip</td>" 
    Add-Content -Path $ServiceFileName "<td bgcolor='#b1ffb1' align=center>$toip</td>" 
     
    if($ErrorMessage) 
    { 
        Add-Content -Path $ServiceFileName "<td bgcolor='#ffb1b1' align=center><strong>$FailOverStatus</strong></td>" 
    } 
    else 
    { 
        Add-Content -Path $ServiceFileName "<td bgcolor='#b1ffb1' align=center><strong>$FailOverStatus</strong></td>" 
    } 
     
    Add-Content -Path $ServiceFileName "</tr>" 
 
} 
 
Function writeFailOverHtmlFooter 
{ 
    param($ServiceFileName) 
    Add-Content -Path $ServiceFileName -Value "</table>" 
    Add-Content -Path $ServiceFileName -Value "<font face='calibri'Kind Regards @MMM Operations Team</font>" 
} 
 
 
 
 
while(1 -eq 1) 
{ 
    'PRIMER WHILE 1 = 1 ' 
    Clear-DnsClientCache 
    $ping = New-Object System.Net.Networkinformation.ping 
    $whilescape = $false 
    $pingfail = 0 
    $ErrorMessage = "" 
     
    try 
    { 
        #$getReportServerConfig = Get-WmiObject -namespace root\Microsoft\SqlServer\ReportServer\$getRepoInstace\v13\Admin -class MSReportServer_ConfigurationSetting 
        'entre al try' 
         
        foreach($ip in $addresses) 
        { 
            'entre al foreach' 
            while(!$whilescape) 
            { 
                'entre al whilescape' 
                 
                if($ping.Send($vlnaddress,"1000").Status -notmatch "Success") 
                { 
                'if 2do while' 
                    $pingfail++ 
                     
                    if($pingfail -eq 10) 
                    { 
                        $whilescape = $true 
                    } 
                } 
                else 
                { 
                    'else 2do while' 
                    $pingfail = 0 
                    $whilescape = $false 
                } 
            } 
             
            $checkipservice = (Test-Connection -ComputerName $vlnaddress -Count 3 -AsJob | Wait-Job | Receive-Job) 
             
            if(($whilescape -eq $true-and ($checkipservice.StatusCode -ne "0"-and (($checkipservice.IPV4Address).IPAddressToString -ne $ip)) 
            { 
                'ENTRE AL IF DE CHECKIPSERVICE' 
                $fromip = ($checkipservice.IPV4Address).IPAddressToString 
                $toip = $ip 
                 
                'from ip' 
                $fromip 
                 
                 
                 
                'Set ip' 
                $SetToIP = "`n"+$toip+"`t"+$vlnaddress 
                $SetToIP 
                 
                if($changeHost = Get-Content -Path $ServerPath | where{$_ -match $fromip -and $_ -match "`t"}) 
                { 
                    (Get-Content -Path $ServerPath-replace $changeHost,$SetToIP | Set-Content $ServerPath -Force 
                } 
                elseif($changeHost = Get-Content -Path $ServerPath | where{$_ -match $fromip -and $_ -match " "}) 
                { 
                    (Get-Content -Path $ServerPath-replace $changeHost,$SetToIP | Set-Content $ServerPath -Force 
                } 
                else 
                { 
                    Add-Content -Path $ServerPath -Value "`n" +$SetToIP -Force 
                } 
 
 
                $whilescape = $false 
                $pingfail = 0 
                 
                $GetDate = Get-Date -Format "dd/MM/yyyy HH:mm:ss"                 
                $mailParams.Subject = "$GetDate FAILOVER PERFORMED - $vlnaddress - FROM: $fromip TO: $toip - MMM DevOps FailOver Reporting Services Automation" 
                 
                writeFailOverHTMLHeader $ServiceFileName                 
                writeFailOverTableHeader $ServiceFileName 
                $FailOverStatus = "PERFORMED" 
                writeFailOverTable $ServiceFileName $vlnaddress $fromip $toip $FailOverStatus 
                writeFailOverHtmlFooter $ServiceFileName 
                 
                $mailBody = Get-Content $ServiceFileName | Out-string 
                $mailParams.Body = $mailBody+'<b>Regards, MMM Operation Team @ dominiobigote</b><br><img src="{0}" /></body></html>' -f ($attachment.Name) 
                         
                Send-MailMessage @mailParams 
                'ENTRE AL CORREO DEL IF PARA CMABIAR LA IP' 
                 
            }         
        } 
    } 
    catch [Exception] 
    {         
        'ENTRE AL CATCH' 
        $ErrorMessage = $_.Exception.Message 
        $pingfail = 0 
        $whilescape = $false 
 
        $GetDate = Get-Date -Format "dd/MM/yyyy HH:mm:ss"                 
        $mailParams.Subject = "$GetDate FAILOVER FAILED - $vlnaddress - FROM: $fromip TO: $toip - MMM DevOps FailOver Reporting Services Automation" 
         
        $FailOverStatus = $ErrorMessage 
        writeFailOverHTMLHeader $ServiceFileName                 
        writeFailOverTableHeader $ServiceFileName 
        $FailOverStatus = "PERFORMED" 
        writeFailOverTable $ServiceFileName $vlnaddress $fromip $toip $FailOverStatus 
        writeFailOverHtmlFooter $ServiceFileName 
         
        $mailBody = Get-Content $ServiceFileName | Out-string 
        $mailParams.Body = $mailBody+'<b>Regards, MMM Operation Team @ dominiobigote</b><br><img src="{0}" /></body></html>' -f ($attachment.Name) 
                 
        Send-MailMessage @mailParams 
 
    } 
     
}