I recently encountered an issue in vSphere 5.5 where I wasn’t able to change the interface speed on an ESXi host from auto-negotiate to anything else. After a good amount of troubleshooting I was able to determine that this issue was occurring due to the fact that the NIC firmware version and driver version on a blade server was out of date. VMware has a good KB article on how to grab the firmware and driver versions that I followed. However, the problem is that even on the most modest ESXi host that isn’t running 10G to it, you’ll likely have a minimum of 4 NICs on it. This means that you’ll have to enable SSH on every host you want to check, run one command per NIC each of them (or run a one line script that loops through them, but will that really save you time..?). It doesn’t take a very large cluster for that to become a very large endeavor.
This PowerShell script will connect to a vCenter server, allow you to scan all ESXi hosts, or only hosts within a particular cluster, and output the results in object format so that you can manipulate them how you wish.
As a refresher, the esxcli command you’ll run to list the required information is below. Substitute [#IFINDEX] with the interface index you want to look at (ie, vmnic1)
esxcli network nic get -n vmnic[#IFINDEX]
Which will output something like this:
Advertised Auto Negotiation: true
Advertised Link Modes: 1000baseT/Full, 2500baseT/Full, 10000baseT/Full
Auto Negotiation: true
Cable Type: FIBRE
Current Message Level: 0
Driver Info:
Bus Info: 0000:02:00.0
Driver: bnx2x
Firmware Version: bc 6.2.28 phy baa0.105
Version: 2.710.39.v55.2
Link Detected: true
Link Status: Up
Name: vmnic0
PHYAddress: 16
Pause Autonegotiate: true
Pause RX: true
Pause TX: true
Supported Ports: FIBRE
Supports Auto Negotiation: true
Supports Pause: true
Supports Wakeon: true
Transceiver: internal
Wakeon: MagicPacket(tm)
The key info is bold above. The Version: line is referring to the Driver version.
Now, what if you could gather the same information for every host in attached to a vCenter server by simply running a single command specifying your VirtualCenter server and the cluster name. The script below will do exactly that. See comment based help for more info.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
<#
.NOTES
===========================================================================
Created with: SAPIEN Technologies, Inc., PowerShell Studio 2014 v4.1.65
Created on: 10/17/2014 10:43 AM
Created by: Jon Howe
Filename: Get-NICAndFirmware.ps1
===========================================================================
.SYNOPSIS
Connects to VirtualCenter and lists pertinent NIC driver and version information
.DESCRIPTION
Connects to VirtualCenter and lists pertinent NIC driver and version information
.PARAMETER $VirtualCenterServer
Required String Parameter. The fully qualified domain name of the virtualcenter server
.PARAMETER $cluster
Optional StringParameter. The name of the cluster you want to filter by.
.PARAMETER $asLocalUser
Optional Boolean Parameter. Do you want to connect to vC as you, or do you want to manually
authenticate as a different user
.EXAMPLE
Get-NicDriverAndFirmware -VirtualCenterServer vc-tst-1.test.in
Actions Taken:
This will connect to the specified virtualcenter server and list the driver name, version,
and firmware version for every NIC in every host attached to your vCenter server. The script will
authenticate to vCenter as your locally logged in user.
Results:
Host_Name VMNic_Name DriverName DriverVersion FirmwareVersion
--------- ---------- ---------- ------------- ---------------
ESXi-1.test.in.parata.local vmnic0 bnx2x 1.72.56.v55.2 bc 5.2.7 phy baa0.105
ESXi-1.test.in.parata.local vmnic1 bnx2x 1.72.56.v55.2 bc 5.2.7 phy baa0.105
ESXi-1.test.in.parata.local vmnic2 e1000e 1.1.2-NAPI 5.12-6
ESXi-1.test.in.parata.local vmnic3 e1000e 1.1.2-NAPI 5.12-6
ESXi-1.test.in.parata.local vmnic4 e1000e 1.1.2-NAPI 5.12-6
ESXi-1.test.in.parata.local vmnic5 e1000e 1.1.2-NAPI 5.12-6
.EXAMPLE
Get-NicDriverAndFirmware -VirtualCenterServer vc-tst-1.test.in -ClusterName Production -asLocalUser $False | Format-Table -AutoSize
Actions Taken:
This will connect to the specified virtualcenter server and list the driver name, version,
and firmware version for each NIC in every host in the cluster "Production", and will prompt for a username and password.
Resuts:
Same as example 1
.EXAMPLE
Get-NicDriverAndFirmware -VirtualCenterServer vc-tst-1.test.in -ClusterName Production -asLocalUser $False | c:\temp\vCenterInterfaceDriverandFirmware.csv -notypeinformation
Actions Taken:
This script outputs an object, so you can do anything you want with the output, such as create a CSV, sort, etc.
Results:
Sames as example 1
.LINK
Original Published Location
http://45.63.13.214/vmware-powercli-gather-nic-driver-and-firmware-versions-from-hosts-via-vcenter
.LINK
VMware KB for gathering NIC Driver and Firmware versions
http://kb.vmware.com/kb/1027206
.LINK
VMware Documentation on PowerCLI's Get-EsxCli commandlet
http://pubs.vmware.com/vsphere-55/topic/com.vmware.powercli.cmdletref.doc/Get-EsxCli.html
#>
[CmdletBinding()]
param (
[Parameter(Position = 0, Mandatory = $true)]
[System.String]
$VirtualCenterServer,
[Parameter(Position = 1)]
[System.String]
$ClusterName,
[Parameter(Position = 2)]
[System.Boolean]
$asLocalUser = $true
)
#region Add Snapin and Connect to vC
#Check to see if the VMware.VimAutomation.Core snapin is loaded - load it if it's not
if ((Get-PSSnapin -Name VMware.VimAutomation.Core -ErrorAction SilentlyContinue) -eq $null)
{
Add-PsSnapin VMware.VimAutomation.Core
}
#Check to see if we're already connected to the correct VC Server
if ($DefaultVIServers.name -ne $VirtualCenterServer)
{
#Determine if we're logging in to VirtualCenter as a local user or if we should prompt for credentials
if ($asLocalUser)
{
Connect-VIServer -Server $VirtualCenterServer | Out-Null
Write-Debug "Logging in as local user to vc: $VirtualCenterServer"
}
else
{
Connect-VIServer -Server $VirtualCenterServer -Credential (Get-Credential) | Out-Null
Write-Debug "Logging in as manually selected user to vc: $VirtualCenterServer"
}
}
else
{
Write-Debug "Looks like we're already connected to: $VirtualCenterServer in this session"
}
#endregion Add Snapin and Connect to vC
#region Get List of Hosts
if ($ClusterName)
{
$VMHosts = Get-Cluster -Name $ClusterName | Get-VMHost | Where-Object { $_.ConnectionState -eq "Connected" }
}
else
{
$VMhosts = Get-VMHost | Where-Object { $_.ConnectionState -eq "Connected" }
}
#endregion Get List of Hosts
$results = @()
foreach ($VMHost in $VMHosts)
{
#Get list of network interfaces on host
$VMHostNetworkAdapters = Get-VMHost $VMHost | Get-VMHostNetworkAdapter | Where-Object { $_.Name -like "vmnic*" }
$esxcli = Get-VMHost $VMHost | Get-EsxCli
$arrNicDetail = @()
foreach ($VMNic in $VMHostNetworkAdapters)
{
$objOneNic = New-Object System.Object
$objDriverInfo = ($esxcli.network.nic.get($VMNic.Name)).DriverInfo
$objOneNic | Add-Member -type NoteProperty -name Host_Name -Value $VMHost.Name
$objOneNic | Add-Member -type NoteProperty -name VMNic_Name -Value $VMNic.Name
$objOneNic | Add-Member -type NoteProperty -name DriverName -Value $objDriverInfo.Driver
$objOneNic | Add-Member -type NoteProperty -name DriverVersion -Value $objDriverInfo.Version
$objOneNic | Add-Member -type NoteProperty -name FirmwareVersion -Value $objDriverInfo.FirmwareVersion
$arrNicDetail += $objOneNic
}
$results += $arrNicDetail
}
$results
Disconnect-VIServer -Server $VirtualCenterServer -Confirm:$false
Remove-PSSnapin VMware.VimAutomation.Core
|