Introduction
Was asked to review SRM Recovery Plans especially on source and destination network settings that gets customised during failover. Due to large number of virtual machines to review, it was not ideal to go through recovery plans one by one. Thus, came up with a script to generate an output for review.
Environment
- vCenter Server 5.0 U2
- SRM 5.0 U2
- PowerCLI 6.0 Release 1
Walk-through
First of all, I tried SRM API through PowerCLI, however the SRM API version was not at 2.0 so that I did not have access to all APIs. Hence, I had to find an alternative. Doing some research, found an executable called dr-ip-reporter.exe which allowed me to generate an XML file with all information that I needed. One thing popped up in my mind was to convert XML file into CSV.
Running the executable to get XML output, copy it to where PowerCLI is installed was a little bit troublesome. Hence, came up with a plan to use psexec.exe to run the dr-ip-reporter.exe remotely and save the output as a variable. However, the executable did not have arguments for username and password. Therefore, this had to be ran manually.
Steps below:
- Login to Windows server where SRM server is installed.
- Open up a command prompt and run dr-ip-reporter.exe. Run the following command:
- C:\Program Files\VMware\VMware vCenter Site Recovery Manager\bin\dr-ip-reporter.exe –cfg C:\Program Files\VMware\VMware vCenter Site Recovery Manager\config\vmware-dr.xml –out C:\SRM\IP.xml –vc “vCenter IP or hostname” -i
-
- Modify IP.xml file, the very top line “<?xml version=”2.0″ encoding=”UTF-8″?>” to “<?xml version=”1.0″ encoding=”UTF-8″?>” as per the following screenshot below:
- Before
- After
- Before
Once the pre-requisite is done:
- Copy the IP.xml and paste it to where SRM-XML-Convert.ps1 script.
- Run the SRM-XML-Convert.ps1
- Check the output, srm_final_output.csv
Sample Output
Looking at output below, you would be easily able to identify that:
- For TEST1 VM, recovery site DNS servers are missing
- For TEST2 VM, both protection and recovery site network setting is missing
- For TEST3 VM, recovery site network setting is missing
"Protection Group","VM","Site","IP Address","SubnetMask","Gateway","DNS Servers" "PG1","TEST1","Site-1","10.10.1.1","255.255.255.0","10.10.1.254","10.10.1.253,10.10.1.252" "PG1","TEST1","Site-2","10.10.2.1","255.255.255.0","10.10.2.254","" "PG1","TEST2","Site-1","","","","" "PG1","TEST2","Site-2","","","","" "PG2","TEST3","Site-1","10.20.1.1","255.255.255.0","10.20.1.254","10.10.1.253,10.10.1.252" "PG2","TEST3","Site-2","","","",""
Script
<# Import IP.xml generated from DR IP Reporter Foreach line of IP.xml file, select components needed. In this case: Protection Group Name of the VM Site IP Address Subnet Mask Gateway DNS Servers #> [xml]$input_file = Get-Content IP.xml $output = $input_file.DrMappings.ProtectionGroups.ProtectionGroup | Sort Name | ForEach-Object { $protection_group = $_.Name $_.ProtectedVm | Sort Name | ForEach-Object { $vm = $_.Name $_.CustomizationSpec | Sort Site | ForEach-Object { $site = $_.Site $ip_settings = $_.ConfigRoot.e.ipSettings if ($ip_settings) { $ip_address = $ip_settings.ip.ipAddress $subnetmask = $ip_settings.subnetMask $gateway = $ip_settings.gateway.e."#text" if ($ip_settings.dnsServerList.e) { $dns_server = [string]::Join(",", ($ip_settings.dnsServerList.e."#text")) } } "" | Select @{N="Protection Group";E={$protection_group}}, @{N="VM";E={$vm}}, @{N="Site";E={$site}}, @{N="IP Address";E={$ip_address}}, @{N="SubnetMask";E={$subnetmask}}, @{N="Gateway";E={$gateway}}, @{N="DNS Servers";E={$dns_server}} $ip_address = ""; $subnetmask = ""; $gateway = ""; $dns_server = ""; } } } $output | Export-Csv -UseCulture -NoTypeInformation srm_final_output.csv Disconnect-VIServer * -Confirm:$false
Hope this and feel free to contact me for any clarifications 😀
Great post! I am working on a 5.1 to 6.0 migration and have used your instructions to export my 5.1 SRM configuration. I’ve reviewed the SRM API and I’m confident I can recreate my settings with this export.
Very glad that it helped!
Export-Csv : Cannot bind argument to parameter ‘InputObject’ because it is null.