67、自动化 VMware vSphere 之 PowerCLI 全解析

自动化 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 - Help :是获取 cmdlet 或 PowerShell 主题帮助信息的实用工具。例如, Get - Help Get - Log 可返回 Get - Log 的简要概述、使用语法、详细描述及相关链接;若只需示例,可使用 -examples 参数,即 Get - Help Get - Log -examples 。常见的参数还有 -full
3. 连接到 vCenter Server 和 ESXi 主机
  • Connect - VIServer :这是 PowerCLI 用户必须掌握的第一个 cmdlet,用于连接 vCenter Server 或 ESXi 主机。
    • 基本连接 :需提供 vCenter Server 名称、用户名和密码,如 Connect - VIServer -server <vCenter Server Name> -user <username> -password <password> 。但此方法将密码明文显示,存在安全风险。
    • 安全连接 :可使用 Get - Credential cmdlet 安全地提示用户输入凭据并加密存储在变量中,示例如下:
$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 系统的虚拟机移动到指定资源池 |

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值