自动化 VMware vSphere 之 PowerCLI 全解析
1. PowerCLI 基础介绍
PowerCLI 是 VMware 提供的强大工具,在安装时存在自定义选项,可安装并启用 vCloud Director 管理单元。此外,还有用于管理 VMware View 和 VMware Update Manager (VUM) 的管理单元可供下载,其安装方式与 PowerCLI 类似。PowerCLI 的核心组件包含超 370 个 cmdlet,具备强大功能,额外管理单元还能进一步扩展其能力。
PowerCLI 具有良好的向后兼容性,新版本基本能与旧版本 vSphere 兼容。不过,PowerCLI 5.5 仅支持 vSphere 4.0 Update 4 及更高版本。需要注意的是,VMware Update Manager (VUM) 管理单元是个例外,使用时必须确保管理单元版本与 VUM 版本匹配。
2. 快速入门 PowerCLI
-
查找 cmdlet
-
Get - VICommand
:专门用于查找 PowerCLI 提供的 cmdlet。例如,若要查找管理日志的可用 cmdlet,可使用
Get - VICommand *log*。 -
Get - Command
:可通过
-Noun参数缩小搜索范围到 cmdlet 的名词部分,如Get - Command -Noun *log*。但该命令会返回所有 PowerShell 中名词部分包含 “log” 的 cmdlet,而Get - VICommand仅返回与 PowerCLI 相关的 cmdlet。 - Show - Command :若使用 PowerShell 3 版本,可使用此 cmdlet 直观查看 cmdlet 及其参数。
- Tab 补全 :PowerShell 为所有 cmdlet 提供 Tab 补全功能。输入部分 cmdlet 后按 Tab 键,可筛选以该部分开头的可用 cmdlet;在 cmdlet 后按空格再按 Tab 键,可循环切换参数列表。
-
Get - VICommand
:专门用于查找 PowerCLI 提供的 cmdlet。例如,若要查找管理日志的可用 cmdlet,可使用
-
获取帮助
-
Get - Help
:是获取 cmdlet 或 PowerShell 主题帮助信息的实用工具。例如,
Get - Help Get - Log可返回Get - Log的简要概述、使用语法、详细描述及相关链接;若只需示例,可使用-examples参数,即Get - Help Get - Log -examples。常见的参数还有-full。
-
Get - Help
:是获取 cmdlet 或 PowerShell 主题帮助信息的实用工具。例如,
3. 连接到 vCenter Server 和 ESXi 主机
-
Connect - VIServer
:这是 PowerCLI 用户必须掌握的第一个 cmdlet,用于连接 vCenter Server 或 ESXi 主机。
-
基本连接
:需提供 vCenter Server 名称、用户名和密码,如
Connect - VIServer -server <vCenter Server Name> -user <username> -password <password>。但此方法将密码明文显示,存在安全风险。 -
安全连接
:可使用
Get - Credentialcmdlet 安全地提示用户输入凭据并加密存储在变量中,示例如下:
-
基本连接
:需提供 vCenter Server 名称、用户名和密码,如
$credential = Get - Credential
Connect - VIServer -server <vCenter Server Name> -Credential $credential
- **连接多台服务器**:可在 `-server` 参数中用逗号分隔多个 vCenter Server 实例或 ESXi 主机,如 `Connect - VIServer -server vCenter1,vCenter2 -Credential $credential`。
- **连接所有关联的 vCenter Server**:对于运行多个处于链接模式的 vCenter Server 实例的管理员,可使用 `-AllLinked` 参数,如 `Connect - VIServer -server vCenter1 -Credential $credential -AllLinked:$true`。
-
Disconnect - VIServer
:用于断开与服务器的连接。运行该 cmdlet 时,会提示确认断开操作;可使用
-Confirm:$false参数避免提示。例如:
Disconnect - VIServer -Server vCenter1,vCenter2 -Confirm:$false
Disconnect - VIServer * -Confirm:$false
-
查看连接状态
:可通过输入
$DefaultVIServers查看当前连接的 vCenter 服务器或 ESXi 主机,输入$DefaultVIServer查看当前默认系统。
4. 第一个单行脚本:报告生成
PowerCLI 常用于快速收集 vSphere 环境数据。由于 ESXi 不再长时间存储日志信息,需将所有 ESXi 主机的系统日志数据指向外部位置。可使用以下单行脚本来确定哪些主机已配置系统日志服务器:
Get - VMhost | Get - VMHostSyslogServer | Export - CSV E:\Reports\Syslog.csv -NoTypeInformation
但此脚本无法显示每个主机的具体配置,可通过以下改进脚本解决:
Get - VMHost | Select Name, @{N="SyslogServer";E={$_ |Get - VMHostSyslogServer}} | Export - CSV E:\Reports\Syslog.csv -NoTypeInformation
5. 第一个单行脚本:配置更改
PowerCLI 不仅可用于报告数据,还能在具备相应权限时修改环境配置。若发现部分 ESXi 主机的系统日志设置不正确,可使用以下脚本更新:
Get - VMHost | Set - VMHostSyslogServer -SysLogServer 192.168.0.100 -SysLogServerPort 514
不过,此脚本会更新所有收集到的 VMHost 的设置。若只想更新配置错误的主机,可使用以下改进脚本:
Get - VMHost | Select Name, @{N="SyslogServer";E={$_ |Get - VMHostSyslogServer}} | Where{$_.SyslogServer -notlike "192.168.0.100:514"} | Set - VMHostSyslogServer -SysLogServer 192.168.0.100 -SysLogServerPort 514
但该脚本会报错,因为对象类型不匹配。可使用
ForEach
循环解决:
Get - VMHost | Select Name, @{N="SyslogServer";E={$_ |Get - VMHostSyslogServer}} | Where{$_.SyslogServer -notlike "192.168.0.100:514"} | %{Set - VMHostSyslogServer -VMhost (Get - VMHost -Name $_.Name) -SysLogServer 192.168.0.100 -SysLogServerPort 514}
以下是连接 vCenter Server 的流程 mermaid 图:
graph LR
A[开始] --> B{选择连接方式}
B --> |基本连接| C[输入 vCenter 名称、用户名、密码]
B --> |安全连接| D[使用 Get - Credential 获取凭据]
C --> E[执行 Connect - VIServer 命令]
D --> E
E --> F{是否连接多台服务器}
F --> |是| G[使用逗号分隔服务器名称]
F --> |否| H[单服务器连接完成]
G --> I[完成多服务器连接]
通过以上步骤,我们了解了 PowerCLI 的基本操作,包括查找 cmdlet、获取帮助、连接服务器、生成报告和更改配置等。后续我们将继续介绍如何构建更复杂的 PowerCLI 脚本。
自动化 VMware vSphere 之 PowerCLI 全解析
6. 构建 PowerCLI 脚本
6.1 迁移主机上的所有虚拟机
可以通过组合多个 PowerCLI cmdlet 构建一个简单的管道来实现更复杂的命令,如将指定 ESXi 主机上的所有虚拟机迁移到另一台 ESXi 主机:
Get - VMHost <FirstHost> | Get - VM | Move - VM –destination (Get - VMHost <SecondHost>)
此命令会将
<FirstHost>
上的所有虚拟机(包括正在运行的和已关闭的)迁移到
<SecondHost>
。也可以将源主机和目标主机存储在变量中实现相同操作:
$SourceHost = Get - VMHost <FirstHost>
$DestinationHost = Get - VMHost <SecondHost>
Get - VMHost $SourceHost | Get - VM | Move - VM -destination $DestinationHost
Set - VMHost $SourceHost -State Maintenance
6.2 操作虚拟机快照
使用 PowerCLI 可以方便地操作虚拟机快照。例如,为 vCenter 库存文件夹中与应用程序关联的所有虚拟机创建快照:
Get - Folder <Folder Name> | Get - VM | New - Snapshot -Name "Pre - Upgrade"
若要删除之前创建的快照:
Get - Folder <Folder Name> | Get - VM | Get - Snapshot -Name "Pre - Upgrade" | Remove - Snapshot
查看指定文件夹中所有虚拟机的快照列表:
Get - Folder <Folder Name> | Get - VM | Get - Snapshot
6.3 重新配置虚拟机网络
将所有连接到旧端口组的虚拟机移动到新端口组,可使用以下单行命令:
Get - VM | Get - NetworkAdapter | Where - Object {$_.NetworkName -like "OldPortGroupName"} | Set - NetworkAdapter –NetworkName "NewPortGroupName" –Confirm:$false
此命令的执行步骤如下:
1.
Get - VM
:检索虚拟机对象。
2.
Get - NetworkAdapter
:获取所有虚拟机的虚拟网卡对象。
3.
Where - Object
:筛选出网络名称为 “OldPortGroupName” 的虚拟网卡。
4.
Set - NetworkAdapter
:将筛选出的虚拟网卡的网络名称设置为 “NewPortGroupName”。
5.
–Confirm:$false
:避免每次操作都提示用户确认。
6.4 虚拟机在资源池之间的移动
要将资源池中运行 Microsoft Windows 来宾操作系统的虚拟机移动到新的资源池,不能直接使用单行命令,需要使用多行脚本:
$VMs = Get - VM –Location (Get - ResourcePool Infrastructure)
foreach ($vm in $VMs) {
$vmguest = Get - VMGuest –VM $vm
if ($vmguest.OSFullName –match "^Microsoft Windows.*") {
Move - VM –VM $vm –Destination (Get - ResourcePool "Windows VMs")
}
}
脚本执行步骤如下:
1. 第一行使用
Get - VM
和
Get - ResourcePool
cmdlet 获取指定资源池中的虚拟机对象列表,并存储在
$VMs
变量中。
2. 第二行创建一个循环,对
$VMs
变量中的每个虚拟机对象进行操作。
3. 第三行使用
Get - VMGuest
cmdlet 获取当前虚拟机的来宾操作系统对象,并存储在
$vmguest
变量中。
4. 第四行检查
$vmguest
对象的
OSFullName
属性是否以 “Microsoft Windows” 开头。
5. 第五行如果检查成功,则使用
Move - VM
和
Get - ResourcePool
cmdlet 将虚拟机移动到名为 “Windows VMs” 的资源池。
以下是操作虚拟机快照的流程 mermaid 图:
graph LR
A[开始] --> B{选择操作类型}
B --> |创建快照| C[获取文件夹中的虚拟机]
B --> |删除快照| D[获取文件夹中的虚拟机及指定快照]
B --> |查看快照列表| E[获取文件夹中的虚拟机及所有快照]
C --> F[创建预升级快照]
D --> G[删除预升级快照]
E --> H[显示快照列表]
7. 总结
通过上述内容,我们全面了解了 PowerCLI 的使用方法,包括基础操作、连接服务器、生成报告、更改配置以及构建脚本等。PowerCLI 提供了丰富的 cmdlet 和灵活的管道操作,能够极大地提高 VMware vSphere 环境的自动化管理效率。无论是简单的单行脚本还是复杂的多行脚本,都可以根据实际需求进行编写和定制,帮助管理员更轻松地完成各种管理任务。
以下是 PowerCLI 常用操作总结表格:
| 操作类型 | 示例命令 | 说明 |
| ---- | ---- | ---- |
| 查找 cmdlet |
Get - VICommand *log*
| 查找与日志相关的 PowerCLI cmdlet |
| 获取帮助 |
Get - Help Get - Log -examples
| 获取
Get - Log
cmdlet 的使用示例 |
| 连接服务器 |
Connect - VIServer -server <vCenter Server Name> -Credential $credential
| 安全连接到 vCenter Server |
| 生成报告 |
Get - VMHost | Select Name, @{N="SyslogServer";E={$_ |Get - VMHostSyslogServer}} | Export - CSV E:\Reports\Syslog.csv -NoTypeInformation
| 生成 ESXi 主机系统日志配置报告 |
| 更改配置 |
Get - VMHost | Set - VMHostSyslogServer -SysLogServer 192.168.0.100 -SysLogServerPort 514
| 更新 ESXi 主机的系统日志配置 |
| 迁移虚拟机 |
Get - VMHost <FirstHost> | Get - VM | Move - VM –destination (Get - VMHost <SecondHost>)
| 将一台主机上的所有虚拟机迁移到另一台主机 |
| 操作快照 |
Get - Folder <Folder Name> | Get - VM | New - Snapshot -Name "Pre - Upgrade"
| 为指定文件夹中的虚拟机创建快照 |
| 重新配置网络 |
Get - VM | Get - NetworkAdapter | Where - Object {$_.NetworkName -like "OldPortGroupName"} | Set - NetworkAdapter –NetworkName "NewPortGroupName" –Confirm:$false
| 将虚拟机的网络连接从旧端口组切换到新端口组 |
| 移动虚拟机到资源池 | 多行脚本 | 将运行 Windows 系统的虚拟机移动到指定资源池 |
超级会员免费看
379

被折叠的 条评论
为什么被折叠?



