# encoding: ascii # api: powershell # title: vProfile-ClusterAudit # description: This script will compare all VI/vSphere cluster nodes against a reference node # version: 1.0 # type: script # author: LucD # license: CC0 # function: Compare-Attributes # x-poshcode-id: 1313 # x-archived: 2009-09-16T23:59:51 # # # vProfile-ClusterAudit.ps1 : vSphere cluster node auditing script # This script will compare all VI/vSphere cluster nodes against a reference node # Parameters: # $xmlFile : XML profile file, created by the vProfile.ps1 script # $csvFile : CSV file that will conatin the discovered differences # $referenceHost : hostname of the node that will the "reference" node # Author: LucD # History: # v1.0 27/08/09 first version # # Parameters $xmlFile = "C:\vInventoryCluster-Clus1.xml" $csvFile = "C:\Clus1-diff.csv" $referenceHost = "esx41.test.local" $global:report = @() function Compare-Attributes{ param($ref, $node, $path, $origrow) $refFirstAttrib = $ref.MoveToFirstAttribute() $nodeFirstAttrib = $node.MoveToFirstAttribute() if($refFirstAttrib -and $nodeFirstAttrib){ do { if($node.Value -ne $ref.Value){ $line = $origrow $line.Name = $ref.LocalName $line.RefValue = $ref.Value $line.CmpValue = $node.Value $global:report += $line } $refNextAttrib = $ref.MoveToNextAttribute() $nodeNextAttrib = $node.MoveToNextAttribute() } while ($refNextAttrib -and $nodeNextAttrib) $dummy = $ref.MoveToParent() $dummy = $node.MoveToParent() } } function Compare-Recursive{ param($ref, $nav, $path) $path += ("/" + $nav.LocalName) $report = @() $row = New-Object PsObject $row | Add-Member -MemberType NoteProperty -Name Path -Value "na" $row | Add-Member -MemberType NoteProperty -Name RefHost -Value "na" $row | Add-Member -MemberType NoteProperty -Name CmpHost -Value "na" $row | Add-Member -MemberType NoteProperty -Name Name -Value "na" $row | Add-Member -MemberType NoteProperty -Name RefValue -Value "na" $row | Add-Member -MemberType NoteProperty -Name CmpValue -Value "na" $row | Add-Member -MemberType NoteProperty -Name AttributeDiscrepancy -Value $false $row | Add-Member -MemberType NoteProperty -Name ChildrenDiscrepancy -Value $false $row.Path = $path $row.RefHost = $refHost.Name $row.CmpHost = $selHost.Name if($nav.HasAttributes -and $ref.HasAttributes){ Compare-Attributes $ref $nav $path $row } elseif($nav.HasAttributes -ne $ref.HasAttributes){ $row.AttributeDiscrepancy = $true } if($nav.HasChildren -and $ref.HasChildren){ $refFirstChild = $ref.MoveToFirstChild() $navFirstChild = $nav.MoveToFirstChild() if($refFirstChild -and $navFirstChild){ do { Compare-Recursive $ref $nav $path $refNextChild = $ref.MoveToNext() $navNextChild = $nav.MoveToNext() } while ($refNextChild -and $navNextChild) $dummy = $ref.MoveToParent() $dummy = $nav.MoveToParent() } } elseif($nav.HasChildren -ne $ref.HasChildren){ $row.ChildrenDiscrepancy = $true } } $path = "Inventory/Cluster" $xml = [xml](Get-Content $xmlFile) $refPath = "Inventory/Cluster/Host[@Name='" + $referenceHost + "']" $otherPath = "Inventory/Cluster/Host[@Name!='" + $referenceHost + "']" $refHost = $xml.SelectSingleNode($refPath) $refNav = $refHost.PSBase.CreateNavigator() foreach($selHost in $xml.SelectNodes($otherPath)){ $refCopy = $refNav $navigator = $selHost.PSBase.CreateNavigator() $result += (Compare-Recursive $refCopy $navigator $path) } $global:report | Export-Csv $csvFile -NoTypeInformation