Highlighted
Immortal
Immortal

Cisco Discovery Protocol

Jump to solution

How easy would it be to get the below codes output to a spreadsheet. Ideally each column be the name of the ESXi Host and under those columns are the returned results.

Get-VMHost | Where-Object {$_.State -eq "Connected"} |
%{Get-View $_.ID} |
%{$esxname = $_.Name; Get-View $_.ConfigManager.NetworkSystem} |
%{ foreach($physnic in $_.NetworkInfo.Pnic){
    $pnicInfo = $_.QueryNetworkHint($physnic.Device)
    foreach($hint in $pnicInfo){
      Write-Host $esxname $physnic.Device
      if( $hint.ConnectedSwitchPort ) {
        $hint.ConnectedSwitchPort
      } else {
        Write-Host "No CDP information available."; Write-Host
      }
    }
  }
}

code found in http://kb.vmware.com/kb/1003885

1 Solution

Accepted Solutions
Highlighted
Expert
Expert

This will give you CSV output where each row is a host with it's CDP properties

cls
$objReport = @()

function Get-CDP    {
    $obj = @()
    Get-VMHost  | Where-Object {$_.State -eq "Connected"} | %{Get-View $_.ID} |
    %{$esxname = $_.Name; Get-View $_.ConfigManager.NetworkSystem} |
    %{ foreach($physnic in $_.NetworkInfo.Pnic){
   
        $obj = "" | Select-Object hostname, pNic,PortId,Address,vlan       
   
        $pnicInfo = $_.QueryNetworkHint($physnic.Device)
        foreach($hint in $pnicInfo){
          #Write-Host "$esxname $($physnic.Device)"
          $obj.hostname = $esxname
          $obj.pNic = $physnic.Device
          if( $hint.ConnectedSwitchPort ) {
            # $hint.ConnectedSwitchPort
            $obj.PortId = $hint.ConnectedSwitchPort.PortId
          } else {
            # Write-Host "No CDP information available."; Write-Host
            $obj.PortId = "No CDP information available."
          }
          $obj.Address = $hint.ConnectedSwitchPort.Address
          $obj.vlan = $hint.ConnectedSwitchPort.vlan
         
        }
        $objReport += $obj
      }
    }
$objReport
}

$results = get-cdp
$results |  Export-Csv "c:\temp\out.csv"

View solution in original post

0 Kudos
9 Replies
Highlighted
Expert
Expert

This will give you CSV output where each row is a host with it's CDP properties

cls
$objReport = @()

function Get-CDP    {
    $obj = @()
    Get-VMHost  | Where-Object {$_.State -eq "Connected"} | %{Get-View $_.ID} |
    %{$esxname = $_.Name; Get-View $_.ConfigManager.NetworkSystem} |
    %{ foreach($physnic in $_.NetworkInfo.Pnic){
   
        $obj = "" | Select-Object hostname, pNic,PortId,Address,vlan       
   
        $pnicInfo = $_.QueryNetworkHint($physnic.Device)
        foreach($hint in $pnicInfo){
          #Write-Host "$esxname $($physnic.Device)"
          $obj.hostname = $esxname
          $obj.pNic = $physnic.Device
          if( $hint.ConnectedSwitchPort ) {
            # $hint.ConnectedSwitchPort
            $obj.PortId = $hint.ConnectedSwitchPort.PortId
          } else {
            # Write-Host "No CDP information available."; Write-Host
            $obj.PortId = "No CDP information available."
          }
          $obj.Address = $hint.ConnectedSwitchPort.Address
          $obj.vlan = $hint.ConnectedSwitchPort.vlan
         
        }
        $objReport += $obj
      }
    }
$objReport
}

$results = get-cdp
$results |  Export-Csv "c:\temp\out.csv"

View solution in original post

0 Kudos
Highlighted
Immortal
Immortal

Thanks BenConrad that should do the trick!

THe attachment is a bit different than your pasted code.  I used the pasted code to get the results.

0 Kudos
Highlighted
Contributor
Contributor

How can i add to this the "Device ID" string?

Thanks!

0 Kudos
Highlighted
User Moderator
User Moderator

You mean the PCI device hash ?

Like this

function Get-CDP    { 

    $objReport = @() 

    Get-VMHost | Where-Object {$_.State -eq "Connected"} | %{Get-View $_.ID} | 

    %{$esxname = $_.Name; Get-View $_.ConfigManager.NetworkSystem} | 

    %{ foreach($physnic in $_.NetworkInfo.Pnic){ 

     

        $obj = "" | Select-Object hostname, pNic,PCI,PortId,Address,vlan         

     

        $pnicInfo = $_.QueryNetworkHint($physnic.Device) 

        foreach($hint in $pnicInfo){ 

          #Write-Host "$esxname $($physnic.Device)" 

          $obj.hostname = $esxname 

          $obj.pNic = $physnic.Device

          $obj.PCI = $physnic.PCI

          if( $hint.ConnectedSwitchPort ) { 

            $obj.PortId = $hint.ConnectedSwitchPort.PortId 

          } else

            $obj.PortId = "No CDP information available." 

          } 

          $obj.Address = $hint.ConnectedSwitchPort.Address 

          $obj.vlan = $hint.ConnectedSwitchPort.vlan 

           

        } 

        $objReport += $obj 

      } 

    } 

$objReport 


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

Highlighted

Thanks to LucD​ for sharing this great function.

I have inetgrated the orignal version into my own Function:

function Get-UplinkDetails {

<#

    .NOTES

    ===========================================================================

    Created by: Markus Kraus

    Twitter: @VMarkus_K

    Private Blog: mycloudrevolution.com

    ===========================================================================

    Changelog: 

    2017.03 ver 1.0 Base Release 

    ===========================================================================

    External Code Sources:

    Get-CDP Version from @LucD22

    https://communities.vmware.com/thread/319553

    ===========================================================================

    Tested Against Environment:

    vSphere Version: vSphere 6.0 U2

    PowerCLI Version: PowerCLI 6.3 R1

    PowerShell Version: 4.0

    OS Version: Server 2012 R2

    Keyword: ESXi, Network, CDP, DVS, vSwitch, VMNIC

    ===========================================================================

    .DESCRIPTION

    This cmdlet collects detailed informations about your ESXi Host connections to pSwitch and DVS / vSwitch

    .Example

    Get-UplinkDetails -Clustername * | ft -AutoSize

    .Example

    Get-UplinkDetails -Clustername MyCluster001 | ft -AutoSize

    .Example

    Get-UplinkDetails -Clustername MyCluster* | Sort Clustername, Hostname, DVS | ft -AutoSize

    .PARAMETER Clustername

    Your vSphere Cluster Name or Wildcard

#Requires PS -Version 4.0

#Requires -Modules VMware.VimAutomation.Core, @{ModuleName="VMware.VimAutomation.Core";ModuleVersion="6.3.0.0"}

#>

[CmdletBinding()]

param(

    [Parameter(Mandatory=$True, ValueFromPipeline=$False, Position=0)]

        [String] $Clustername

       

)

Begin {

    $Validate = $True

    if (($myCluster = Get-Cluster -Name $Clustername).count -lt 1) {

       $Validate = $False

       throw "No Cluster '$myCluster' found"

    }

    if (($myHosts = $myCluster | Get-VMHost).count -lt 1) {

       $Validate = $False

       throw "No Hosts in Cluster '$myCluster' found"

    }

    function Get-CDP ($VMhost){

        $VMhostProxySwitch = $VMhost.NetworkInfo.ExtensionData.ProxySwitch

        $VMhostSwitch = $VMhost.NetworkInfo.VirtualSwitch

        $objReport = @()

        $VMhost| %{Get-View $_.ID} |

        %{ Get-View $_.ConfigManager.NetworkSystem} |

        %{ foreach($physnic in $_.NetworkInfo.Pnic){

    

            $obj = "" | Select-Object Clustername,Hostname,VMNIC,PCI,MAC,DVS,vSwitch,CDP_Port,CDP_Device,CDP_Address  

    

            $pnicInfo = $_.QueryNetworkHint($physnic.Device)

            foreach($hint in $pnicInfo){

                $obj.Clustername = $VMhost.parent.name

                $obj.Hostname = $VMhost.name

                $obj.VMNIC = $physnic.Device

                $obj.PCI = $physnic.PCI

                $obj.MAC = $physnic.Mac

                if ($backing = ($VMhostProxySwitch | where {$_.Spec.Backing.PnicSpec.PnicDevice -eq $physnic.Device}).DvsName) {

                    $obj.DVS = $backing

                    } else {

                        $obj.DVS = "-No Backing-"

                        }

                if ($backing = ($VMhostSwitch | where {$_.Nic -eq $physnic.Device}).Name) {

                    $obj.vSwitch = $backing

                    } else {

                        $obj.vSwitch = "-No Backing-"

                        }

                if( $hint.ConnectedSwitchPort ) {

                    $obj.CDP_Port = $hint.ConnectedSwitchPort.PortId

                    $obj.CDP_Device = $hint.ConnectedSwitchPort.DevId

                    $obj.CDP_Address = $hint.ConnectedSwitchPort.Address 

                    } else {

                        $obj.CDP_Port = "-No Info-"

                        $obj.CDP_Device = "-No Info-"

                        $obj.CDP_Address = "-No Info-"

                        }

               

            }

            $objReport += $obj

            }

        }

        $objReport

    }

 

}

Process {

    $MyView = @()

    if ($Validate -eq $True) {

 

        foreach ($myHost in $myHosts) {

        $CDP = Get-CDP $myHost

        $MyView += $CDP       

  }

          

       $MyView | Sort Clustername, Hostname, VMNIC

    }

    }

}

https://mycloudrevolution.com | https://twitter.com/vMarkus_K | https://github.com/vMarkusK
0 Kudos
Highlighted
Contributor
Contributor

I've modified  vMarkusK1985 script, to include additional cdp fields in the below script:

Highlighted
Enthusiast
Enthusiast

goslackware3​ I would like to incorporate another two properties into vMarkusK1985  script like vmnic link status & vmnic's MTU size. Can you please with those two properties.

0 Kudos
Highlighted
Virtuoso
Virtuoso

Thanks for sharing this great script.

/* Any kind of comment or input would be greatly appreciated */
0 Kudos
Highlighted
Enthusiast
Enthusiast

I have tried to run this script but completing very quickly with no output? Can you suggest how to execute this function?

Copied the below script and Connected the center and executed it as below.

.\Get-UplinkDetails.ps1 -Clustername MyCluster001 | ft -AutoSize

regards

Narayanan.

0 Kudos