因工作需要,收集所有 esxi 主机的序列号。可以通过 vmclient 连接vcenter 查看esxi 的“配置” ,“处理器”项中的服务标记取得

信息类似如下:

wKioL1UwxZCjAshaAADC1luxL4Q593.jpg 

    一台一台的查看,复制,粘贴,还是挺痛苦的,我尝试使用 powercli 去获取。powercli 提供的内置命令没有取得相关信息的,但可以使用 vmware 对 powercli 提供的 SDK,万能的主啊。

    这个命令需要在 powershell3.0以上版本使用,这个版本的一个非常好用的方法就是可以对任何命令返回的结果做为对象,通过“.”加对象的参数名去引用,这样,即使比较复杂的信息,也不需要循环之类的控制语句。

   完整的语句如下,简单解释一下:

get-vmhost 取得你所有要统计的 esxi 主机的对象,对过管道输出给后面处理。

@{N="ip";E={@((Get-VMHostNetworkAdapter -VMHost $_

@符号是对前面管道来的数据做为数组处理

N="IP"是对这一列输出结果全名,这是个很有用途的功能,对于一些命令输出结果项,不支持管道的,可以用这个方式解决。

E= 这个是此列的数据计算表达式,可以是复杂的命令

Get-VMHostNetworkAdapter -VMHost $_

这个是取得的管道里取得的 esxi 对象的对应的网卡的 IP 信息 ,$_ 实际上就是 esxi 对象。

| Where-Object {$_.Name -match "vmk0"}).IP)

这个是对取得的网卡信息进行过滤,就是找到哪个是 esxi 的物理地址,这个要看你的 esxi 是怎么配置的,也许不是 vmk0。

这样,我们就找到了 esxi 对应的 IP 地址信息。


下面是重点了,怎么取得序列号信息。

$_ | get-view)

对前面管道来的 esxi 对象,取得它的内置信息,SDK 包的用法就在这里了,就这一个命令,对不同的对象,能得到不同的信息。

在这个对象里,就包含序列号信息。

Hardware.SystemInfo.OtherIdentifyingInfo

当然 ,输出的结果也不是一行,你要自己找到哪一行是序列号信息。

完整的命令如下:


get-vmhost |
 select name ,@{N="ip";E={@((Get-VMHostNetworkAdapter -VMHost $_ | Where-Object {$_.Name -match "vmk0"}).IP)}} ,@{N="serial";E={@(($_ | get-view).Hardware.SystemInfo.OtherIdentifyingInfo.IdentifierValue[0])}}


如果你想再简单点,可以用管道加命令 export-csv 输出到 csv 里


上面的方法适用于 esxi5.1及以上

对于 esx 和 esxi4.X 的就没有这么有效了。


而且我能过 vcenter 发现同一种服务器,有的可以显示序列号,有的还显示不了。

后来又查了好多资料,发现在 esx系统里使用 esxcfg-info 可以采集到序列号信息。

但这样就需要 esx 开 ssh,还要 ssh 到每台 esx 上去。输出的结果也没上面那么规范了,但不管怎么说,还是比一台一台的查要快一些。


要使用 powershell 实现这个功能,需要安装一个模块,posh-ssh

代码在这里https://github.com/darkoperator/Posh-SSH 

安装方法在这里https://gist.github.com/darkoperator 

使用 get-command -module posh-ssh 可以查看支持的命令

首先使用如下命令建立 ssh 连接,使用 -AcceptKey $true,可以不用每次确认。

New-SSHSession -ComputerName [ip] -Credential $cre -AcceptKey $true

使用 如下命令执行系统内操作

Invoke-SSHCommand -Index 0 -Command "esxcfg-info | grep 'Serial N'"

 index 是你建立到主机的 ssh 的号,如果只有一个,那永远是0

下面的命令就相当于在主机里取序列号的命令

"esxcfg-info | grep 'Serial N'"

用管道就不太好使了,我使用一个简单的循环,总体类似如下:

$sult=for($i=0;$i -lt $ip.count ;$i++){
New-SSHSession -ComputerName $ip.ip[$i] -Credential $cre -AcceptKey $true
Invoke-SSHCommand -Index 0 -Command "esxcfg-info | grep 'Serial N'"
Remove-SSHSession -Index 0 
}

上面的$IP是需要自己收集的,可以用上面的方法收集所有esx的主机地址,

$cre 是认证信息,可以使用$cre=get-Credential 生成

如果输出结果很长,先保存到一个变量中,再将变量输出到文件中


下面的命令是批量启动或 esx 上的 ssh 服务

Get-VMHost  | Get-VMHostService | Where-Object{$_.Key -match "SSH" -and $_.Running -match "True"} | Start-VMHostService

下面的命令是批量关闭或 esx 上的 ssh 服务

Get-VMHost  | Get-VMHostService | Where-Object{$_.Key -match "SSH" -and $_.Running -match "True"} | Stop-VMHostService