2. PowerCLI环境搭建与连接管理

PowerCLI 是 VMware 官方提供的 PowerShell 模块集合,它把 vSphere 的 SOAP/REST API 封装成上千个 cmdlet,让我们可以用脚本批量管理 vCenter 与 ESXi。要把它用起来,第一步不是急着写脚本,而是把运行环境、连接方式和凭据管理这三件事做扎实。本节围绕安装配置、连接 vCenter 与 ESXi、多版本兼容性、凭据安全存储与连接复用展开。

安装与配置 PowerCLI

PowerCLI 现在以 PowerShell 模块形式发布,推荐在 PowerShell 7.x(Windows/Linux/macOS 均可)或 Windows PowerShell 5.1 上安装。安装前先确认 PowerShellGet 可用,然后从 PowerShell Gallery 拉取模块:

# 查看当前 PowerShell 版本与执行策略
$PSVersionTable.PSVersion
Get-ExecutionPolicy -List

# 安装 PowerCLI(当前用户范围,避免管理员权限依赖)
Install-Module -Name VMware.PowerCLI -Scope CurrentUser -AllowClobber

# 验证安装结果
Get-Module -Name VMware.PowerCLI -ListAvailable | Select-Object Name, Version

安装完成后,建议先做几项基础配置,否则首次连接很可能失败。PowerCLI 默认会向 VMware 发送 CEIP 客户体验数据,并可能因证书校验、PowerShell 版本检查而中断自动化脚本:

# 关闭 CEIP 数据收集
Set-PowerCLIConfiguration -Scope User -ParticipateInCEIP $false -Confirm:$false

# 关闭 PowerCLI 版本检查(离线或内网环境常用)
Set-PowerCLIConfiguration -Scope User -InvalidCertificateAction Ignore -Confirm:$false
Set-PowerCLIConfiguration -Scope User -DisplayDeprecationWarnings $false -Confirm:$false

# 查看当前配置
Get-PowerCLIConfiguration
将 InvalidCertificateAction 设为 Ignore 只适合实验或内网自签证书环境。生产环境应导入受信任 CA 证书,或使用 Warn 并配合证书指纹校验,避免中间人风险。

连接 vCenter 与 ESXi

连接 vCenter 使用 Connect-VIServer,连接独立 ESXi 主机使用 Connect-VMHost(或同样用 Connect-VIServer 指向主机地址)。两者返回的都是连接对象,后续 cmdlet 依赖当前会话中的默认连接。

# 连接 vCenter(推荐用 FQDN,避免证书 CN 不匹配)
Connect-VIServer -Server vcsa01.lab.local -User 'administrator@vsphere.local' -Password $pwd

# 连接独立 ESXi 主机
Connect-VIServer -Server esxi01.lab.local -User root -Password $pwd

# 查看当前所有连接
$global:DefaultVIServers

# 断开指定连接
Disconnect-VIServer -Server vcsa01.lab.local -Confirm:$false

当同时连接多个 vCenter 时,PowerCLI 会把最后连接的一个设为默认目标,容易造成“脚本跑到了错误的 vCenter”。稳妥做法是显式指定 -Server 参数,或在脚本开头用 Set-PowerCLIConfiguration -DefaultVIServerMode Multiple 明确多连接模式,并在每个操作中带上目标服务器。

多版本兼容性管理

PowerCLI 版本与 vSphere 版本存在对应关系:较新的 PowerCLI 通常向下兼容旧 vCenter,但旧 PowerCLI 无法管理新版本 vCenter 的新特性。常见做法是按环境隔离模块版本,而不是全局升级。可以用 Save-Module 把指定版本下载到独立目录,再通过 Import-Module -FullyQualifiedName 精确加载:

# 下载指定版本到本地目录
Save-Module -Name VMware.PowerCLI -Path C:\Modules -RequiredVersion 13.0.0.21662141

# 精确加载该版本
Import-Module 'C:\Modules\VMware.PowerCLI\13.0.0.21662141\VMware.PowerCLI.psd1'

# 查看已加载版本
Get-Module VMware.PowerCLI

下表给出常见对应关系的参考(示例,具体以 VMware 官方兼容性矩阵为准):

PowerCLI 版本支持的 vSphere 版本典型场景
13.xvSphere 8.0 / 7.0新环境、REST API 优先
12.xvSphere 7.0 / 6.7主流生产环境
11.xvSphere 6.7 / 6.5旧环境维护

凭据安全存储与连接复用

把明文密码写进脚本是最常见的坏习惯。PowerShell 提供 PSCredential 对象,配合 Export-Clixml 可以把凭据加密保存到文件(Windows 上使用 DPAPI,仅当前用户可解密):

# 首次:交互式输入并保存凭据
$cred = Get-Credential -Message 'vCenter 管理员凭据'
$cred | Export-Clixml -Path "$env:USERPROFILE\.vsphere\vcsa01.cred.xml"

# 后续脚本中读取
$cred = Import-Clixml -Path "$env:USERPROFILE\.vsphere\vcsa01.cred.xml"
Connect-VIServer -Server vcsa01.lab.local -Credential $cred

连接复用方面,PowerCLI 的 Connect-VIServer 本身会维护会话,同一 PowerShell 会话中重复连接同一服务器会复用已有连接。批量脚本中应避免在循环里反复连接/断开,而是“一次连接、多次操作、最后统一断开”。下面这段示例展示了连接复用与凭据读取的组合写法:

$cred = Import-Clixml "$env:USERPROFILE\.vsphere\vcsa01.cred.xml"
Connect-VIServer -Server vcsa01.lab.local -Credential $cred | Out-Null

try {
    Get-VM -Server vcsa01.lab.local | Where-Object PowerState -eq 'PoweredOn' |
        Select-Object Name, NumCpu, MemoryGB
}
finally {
    Disconnect-VIServer -Server vcsa01.lab.local -Confirm:$false
}

下图把本节的关键关系串起来:从安装配置、凭据存储,到连接 vCenter/ESXi,再到多版本隔离与连接复用,形成一条可复用的环境搭建链路。

PowerCLI 环境搭建与连接管理链路 安装与基础配置 Install-Module VMware.PowerCLI Set-PowerCLIConfiguration 关闭 CEIP / 证书策略 凭据安全存储 Get-Credential Export-Clixml / Import-Clixml DPAPI 加密,仅当前用户可读 多版本兼容 Save-Module 指定版本 Import-Module 精确加载 按环境隔离模块目录 连接建立与复用 Connect-VIServer -Server vcsa01.lab.local -Credential $cred 一次连接 → 多次操作 → finally 中 Disconnect-VIServer vCenter Server vcsa01.lab.local 集中管理、批量编排入口 ESXi 主机 esxi01.lab.local 独立主机直连、应急排障 凭据加密存储 + 连接复用 + 版本隔离,是稳定自动化脚本的三块基石
建议把凭据文件、模块目录和脚本放在统一的工程目录下,例如 C:\vsphere-auto\,其中 creds\ 存凭据、modules\ 存指定版本模块、scripts\ 存脚本。这样换机器或交接时,只需复制目录并重新生成凭据文件即可。

最后提醒两点实践细节:一是连接对象是会话级的,脚本结束前务必 Disconnect-VIServer,否则长时间运行会累积会话;二是 Connect-VIServer 支持 -Session 参数复用已有会话对象,在跨函数传递连接时比反复传服务器名更可靠。把本节的环境搭建与连接管理做规范,后续的批量编排才有稳定的执行基础。