ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

VMware PowerCLI从零安装教程:Windows 10环境下连接vCenter与ESXi实战

VMware PowerCLI从零安装教程:Windows 10环境下连接vCenter与ESXi实战 如果你平时要管几台VMware虚拟机或者在公司里维护过vSphere环境一定遇到过这种场景在vCenter Web界面里一台一台点鼠标创建虚拟机、调配置、打快照、看状态重复操作一多整个人都会麻木。我最早接触PowerCLI就是因为要批量给几十台虚拟机做快照手工点了一个下午才弄完后来学会了这个工具同一个任务用一行命令几十秒就能跑完。这篇就是我整理的在Windows 10上从零安装VMware PowerCLI的完整过程包含我踩过的坑、离线安装方案、连接vCenter和ESXi的配置方法以及几个实际能用的命令示例。PowerCLI是VMware官方出品的PowerShell模块用来管理和自动化vSphere环境包括vCenter Server、ESXi主机、虚拟机、存储、网络等所有核心对象。它可以理解成vSphere的“命令行版本”你能在网页上做的操作绝大多数都能用PowerCLI完成而且还能批量、还能写脚本定时跑。这篇文章适合两类读者一类是刚接触虚拟化运维、想把日常操作脚本化的新手另一类是已经在用vSphere、但一直用图形界面操作、想提升效率的运维同学。我会尽量把每一步都讲透包括为什么要这么做。1. 安装前的准备工作装PowerCLI不是双击一个exe就完事它的依赖环境先要搞定。很多人在第一步就卡住通常都是因为Windows 10自带的PowerShell版本太老或者网络源没配好。1.1 确认Windows 10的PowerShell版本PowerCLI本身是PowerShell模块所以先得确认系统里的PowerShell是什么版本。Windows 10系统默认自带Windows PowerShell 5.1但微软官方现在推荐的PowerShell 7.x和Windows PowerShell 5.1是两个不同的产品后者属于Windows自带组件前者需要单独安装。这里有个容易混淆的点PowerCLI新版本特别是12.0以后对PowerShell版本有明确要求。VMware官方兼容性列表里写得很清楚PowerCLI 12.0以上版本推荐使用PowerShell 7.0以上环境虽然也能在Windows PowerShell 5.1上运行部分功能但有些新模块和命令会不兼容。所以我的建议是直接装PowerShell 7.x省得以后用着用着遇到“这个命令不存在”的诡异报错。在开始之前先打开PowerShell窗口确认版本$PSVersionTable.PSVersion如果显示Major版本是5.1建议去微软官网下载PowerShell 7.x的安装包。下载的时候注意选对系统架构Win10基本都是64位系统装msi包就行。安装过程是图形界面一路Next就能完成装好后打开新的“PowerShell 7”终端这时候再执行上面的命令版本号就会变成7.x。我个人的习惯是用PowerShell 7搭配Windows Terminal使用Windows Terminal可以在微软商店免费安装比系统自带的控制台好用很多支持多标签、自定义主题管理多个服务器连接时方便不少。1.2 TLS版本与网络源检查这一步容易被忽略但非常重要。PowerCLI是从PowerShell Gallery在线仓库下载安装的而PowerShell Gallery要求客户端必须支持TLS 1.2协议。Windows 10系统默认可能只开启了TLS 1.0这就导致调用Install-Module命令时频繁报错或者下载到一半直接超时断开。解决办法是在安装模块之前手动指定TLS版本[Net.ServicePointManager]::SecurityProtocol [Net.SecurityProtocolType]::Tls12上面的命令只对当前PowerShell会话生效也就是说每次打开新窗口都要重新执行一遍。如果想省事可以把它写进PowerShell的启动配置文件$PROFILE里这样每次开PowerShell自动生效。顺便提醒一下如果你所在网络环境访问powershellgallery.com比较慢或者不通安装模块时会一直卡在“正在从源中下载”的状态。这种情况后面的离线安装方案可以直接解决。1.3 PowerShell执行策略设置Windows系统默认禁止运行PowerShell脚本执行策略是Restricted这意味着即使模块下载成功也可能因为脚本权限问题加载失败。安装前建议把执行策略改成RemoteSigned这个策略的意思是本地创建的脚本可以运行从网上下载的脚本需要数字签名。修改执行策略的命令Set-ExecutionPolicy RemoteSigned -Scope CurrentUser这里我特意用了-Scope CurrentUser只对当前用户生效不需要管理员权限也不会影响系统的全局配置。如果你是在公司电脑上操作没有管理员权限也没关系这个方式完全够用。提示如果后续PowerCLI连接vCenter的证书校验有问题或者需要加载某些未签名的模块可能还需要临时用Bypass模式但正常工作环境下RemoteSigned足够。2. 正式安装PowerCLI模块准备工作做完后就可以正式开始安装了。这个过程如果顺利的话几分钟就能完成。核心命令就一条Install-Module。2.1 使用Install-Module在线安装打开PowerShell 7不是Windows PowerShell 5.1窗口先设置TLS再安装模块[Net.ServicePointManager]::SecurityProtocol [Net.SecurityProtocolType]::Tls12 Install-Module -Name VMware.PowerCLI -Scope CurrentUser执行后会弹出NuGet提供程序的安装确认输入Y回车。接着可能会提示“从PSGallery安装模块”再输入Y。如果当前用户对PowerShell Gallery的源没有信任配置系统会问是否将PSGallery设置为受信任的源这里建议输入Y以后安装其他模块就不用反复确认了。安装过程会持续几分钟取决于网络速度。PowerCLI不是一个小模块它有几十个依赖子模块包括VMware.VimAutomation.Core、VMware.VimAutomation.Cis.Core、VMware.VimAutomation.Vds等安装器会自动把所有依赖包一并下载。看到进度条走完之后输入以下命令确认安装结果Get-Module -ListAvailable VMware.PowerCLI如果正常输出模块信息说明安装成功。2.2 离线安装方案在线安装是最理想的情况但现实里很多公司机房和办公网是物理隔离的或者下载速度实在惨不忍睹。这时候需要在一台能联网的机器上下载好整个模块包再拷贝到目标机器上离线安装。离线安装的核心过程分两步第一步在联网机器上使用Save-Module命令把模块下载到本地目录而不是直接安装Save-Module -Name VMware.PowerCLI -Path D:\PowerCLI_Offline这条命令会把PowerCLI及其所有依赖模块完整地下载到指定的本地文件夹不会修改这台机器的PowerShell环境。第二步把这个文件夹整个拷贝到目标机器上放到PowerShell的模块搜索路径中。Windows 10上当前用户的模块默认路径是C:\Users\用户名\Documents\PowerShell\ModulesPowerShell 7的默认路径和Windows PowerShell 5.1不一样PowerShell 7读的是C:\Users\用户名\Documents\PowerShell\Modules。把整个VMware.PowerCLI文件夹放进去之后需要确认里面的目录结构是VMware.PowerCLI\版本号\这种形式不能把嵌套层级搞错。还有一点依赖模块也要一起拷贝过去。PowerCLI解压后会有很多VMware.VimAutomation开头的文件夹这些都必须原样保留。我自己整理离线包时习惯把整个Modules目录复制过去避免漏掉子模块。放置完成后在新PowerShell窗口中执行Get-Module -ListAvailable VMware.PowerCLI检查是否识别。2.3 安装后的模块加载与版本校验模块安装好不等于就能用需要先导入到当前会话中。虽然PowerCLI支持自动加载模块但为了避免首次调用时卡顿太久我一般会手动执行导入命令Import-Module VMware.PowerCLI导入过程中会加载一系列依赖模块第一次可能会等待十几秒到几十秒如果一切正常命令行不会输出任何报错信息。接着查看版本确认加载的是新装的那个版本Get-Module VMware.PowerCLI | Select-Object Name, Version检查通过后还可以顺手看看PowerCLI里都有哪些命令。PowerCLI的命令遵循Get-VM、New-VM、Set-VM这种动词-名词命名模式与PowerShell原生风格一致。执行Get-Command -Module VMware.PowerCLI可以看到完整的命令列表数量通常在一百条以上说明环境没问题。3. 初始化配置与连接vCenter安装完成后还不能直接连服务器PowerCLI默认有一些安全策略比如会拦截不受信任的证书、会弹出CEIP客户体验改善计划提示这些都要先处理好否则连接vCenter时很可能会被证书问题挡住。3.1 关闭CEIP和证书检查PowerCLI第一次运行时会问是否加入CEIP客户体验改善计划这就是一个问卷影响不大不想被问就直接关掉。同时很多企业的vCenter证书是自签名证书默认情况下PowerCLI会因为证书不受信任而拒绝连接也必须提前设置为忽略证书校验。两条命令解决Set-PowerCLIConfiguration -ParticipateInCEIP $false -Confirm:$false Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false第一条关闭CEIP第二条设置遇到无效证书时忽略错误。第二条尤其重要我见过很多新手第一次连vCenter时直接报The server certificate is not trusted然后卡在那里不知道怎么办其实就是没改这个配置。Set-PowerCLIConfiguration还有很多其他配置项比如-DefaultVIServerMode可以设置默认连接模式还可以设置WebSession超时时间。另外还有-Scope参数建议显式指定-Scope User表示配置只对当前用户生效。3.2 连接vCenter Server配置搞定后开始连接。连接vCenter的命令很简单Connect-VIServer -Server vcenter.example.com -User administratorvsphere.local -Password 你的密码执行成功后PowerCLI会返回连接的服务器的信息包括名称、端口、版本、Uuid等。连接之后当前PowerShell会话内所有命令都会直接作用于这台vCenter管理的整个环境。为了安全我习惯用Connect-VIServer的交互式登录方式就是先执行Connect-VIServer -Server vcenter.example.com然后系统会弹出Windows安全登录框输入用户名密码这样密码不会出现在命令历史记录里。公司环境如果有域认证还可以用-User domain\username配合Windows集成认证方式。连接不上的情况很常见最典型的有三种网络不通vCenter管理网段和你的电脑不在同一个路由里检查防火墙和路由。端口不通vCenter的默认HTTPS端口是443确认这个端口没有被公司防火墙封禁。凭据错误vSphere账号的密码里如果包含特殊字符在命令行里要用引号包住或者改用交互登录方式。3.3 直连ESXi主机与连接vCenter的区别很多人不知道PowerCLI不仅能连vCenter还能直接连一台ESXi主机。区别在于连接vCenter后你管理的是整个vCenter集群环境里的所有资源直连ESXi只能操作那一台主机而且很多vCenter提供的功能比如DRS、HA、集群级别的操作在直连ESXi时是看不到的。直连ESXi的命令Connect-VIServer -Server 192.168.1.100 -User root -Password 密码直连时用户名通常是root这个用户名是ESXi本地的管理员账号而不是vSphere域账号。如果你只是在实验室里测试PowerCLI功能没有现成的vCenter环境直连一台ESXi或一台开源的VMware虚拟化环境也完全够用。这里还要说清楚一个关系PowerCLI管理的对象是vSphere/ESXi而不是VMware Workstation。VMware Workstation是桌面级虚拟化软件跑在个人电脑上ESXi是服务器级的裸金属虚拟化平台跑在物理服务器上。两者是不同的产品线PowerCLI不能直接管理Workstation里的虚拟机针对Workstation的自动化应该用vmrun工具这点要区分清楚。4. 常用命令实操与脚本示例环境通了之后接下来就是真正体现PowerCLI价值的环节。这一节我分享几个日常运维中最常用的命令以及一个批量操作的脚本示例可以直接抄作业改改就能用。4.1 查看虚拟机、主机与存储资源连接vCenter后把当前环境里的所有虚拟机列出来只需要一行Get-VM | Format-Table Name, PowerState, NumCPU, MemoryGB, Version这里Get-VM返回的是虚拟机对象直接输出又长又乱所以我都会配合Format-Table或Select-Object只显示关心的字段。想看每台虚拟机的IP地址用Get-VM | Get-VMGuest取网络信息。查看ESXi主机和集群的状态Get-VMHost | Format-Table Name, ConnectionState, PowerState, Version Get-Cluster | Format-Table Name, HAEnabled, DRSEnabled查看存储Get-Datastore | Format-Table Name, CapacityGB, FreeSpaceGB这些命令的输出都可以直接导出到CSV文件用来做资产盘点非常方便Get-VM | Select-Object Name, PowerState, NumCPU, MemoryGB | Export-Csv -Path C:\temp\vms.csv -NoTypeInformation -Encoding UTF84.2 批量创建快照并输出报告批量快照是我用得最多的场景。比如有一套业务系统包含10台虚拟机升级之前需要给每台机器都打一个快照用图形界面一台一台点真的很烦。PowerCLI写个循环就完了$vmNames (web-01, web-02, mysql-01) $snapshotName before-upgrade-20240601 foreach ($vm in $vmNames) { Get-VM $vm | New-Snapshot -Name $snapshotName -Description Upgrade preparation }执行完可以确认一下快照都创建成功Get-VM | Get-Snapshot | Where-Object { $_.Name -eq $snapshotName } | Format-Table VM, Name, Created打快照这个操作在生产环境要小心尤其是数据库虚拟机有状态的应用建议跟业务方确认维护窗口再操作因为快照会让虚拟机处于短暂的内存冻结状态IO会暂停几秒。4.3 批量修改虚拟机配置批量调整配置也是PowerCLI的强项。比如把所有web开头的虚拟机内存从4GB升级到8GB命令如下Get-VM web-* | Set-VM -MemoryGB 8 -Confirm:$false要注意的是Set-VM修改在线虚拟机的内存需要虚拟机里装好了VMware Tools并且虚拟机电源状态是开机状态才支持热添加否则会报错或者需要重启生效。所以操作之前先检查状态Get-VM web-* | Format-Table Name, PowerState, ToolsVersion如果Tools版本太老或者没装Tools最好先安排关机再修改。4.4 调度任务与vSphere自动化PowerCLI可以配合Windows任务计划程序定时执行脚本比如每天晚上自动备份虚拟机快照、定时生成资源利用率报告。我把一个完整的脚本保存为daily_report.ps1然后在Windows任务计划程序里创建基本任务触发器选择每天操作中启动程序填powershell.exe参数填-File C:\scripts\daily_report.ps1。脚本内容类似这样Connect-VIServer vcenter.example.com Get-VM | Select Name, PowerState, NumCPU, MemoryGB Disconnect-VIServer -Confirm:$false定时任务跑出来的结果可以通过邮件发送给管理员。PowerCLI本身没有直接的邮件命令但PowerShell自带Send-MailMessage或者用.NET的SmtpClient都可以这个就留给有兴趣的读者自己扩展了。5. 常见问题与排查技巧实录把我在实际安装使用过程中踩过的坑集中整理一下很多问题在网上的文档里不容易直接搜到但遇到了真的很耽误时间。5.1 安装模块时报错“无法安装模块”安装时报错的原因很多最常见的几个未设置TLS 1.2报错提示下载失败或连接被重置。重新执行[Net.ServicePointManager]::SecurityProtocol [Net.SecurityProtocolType]::Tls12。PowerShell源未被信任提示需要信任PSGallery。可以手动设置源为信任Set-PSRepository -Name PSGallery -InstallationPolicy Trusted公司电脑上配置了代理PowerShell下载请求走了代理但代理验签失败。在PowerShell 7里可以用-Proxy参数指定代理地址或者临时关掉系统代理试试。当前用户对Program Files目录无写权限。这就是我在前面强调用-Scope CurrentUser的原因当前用户安装会放到用户目录的Modules文件夹里不需要管理员权限。5.2 连接时提示“证书不受信任”这个问题绝大多数情况是没执行Set-PowerCLIConfiguration -InvalidCertificateAction Ignore。还有个办法是在连接时加上-Force参数跳过证书校验Connect-VIServer vcenter.example.com -Force但-Force只对当前连接有效下次还得加不如直接修改全局配置一劳永逸。需要注意如果公司有严格的安全审计要求忽略证书校验的操作可能需要提前报备因为这会降低连接的安全性。5.3 命令执行慢或超时连接成功后第一条命令总是很慢这是因为PowerCLI在首次会话中要加载SDK和初始化连接信息内存占用也会飙升到几百MB属于正常现象。但如果你每次都慢到不可接受可以检查是不是vCenter服务器本身负载过高或者网络延迟太大。还有一种情况是PowerCLI的WebSession过期了尤其是长时间不操作后再回来执行命令会提示session过期重新执行Connect-VIServer即可。5.4 与VMware Workstation的使用混淆这个问题我问过很多同事大家都有过类似的困惑装了VMware Workstation Pro也装了PowerCLI为什么Connect-VIServer连接不上Workstation里的虚拟机原因前面说过PowerCLI管的是vSphere环境Workstation是桌面级产品。如果你只是学习PowerCLI语法但没有真实的vCenter环境可以考虑在Workstation里装一个VMware ESXi的虚拟机来练手或者使用VMware提供的个人学习环境。这个后面我会单独写一篇教程这里先埋个伏笔。5.5 Win10系统优化对PowerCLI的影响很多人的Windows 10装过各种“优化工具”关掉了一堆服务这有可能会影响PowerCLI的运行。最常见的两个问题一是Win10系统更新把PowerShell 5.1的.NET版本升级到新版本但PowerShell 7没有跟随升级导致某些模块无法加载。解决方式是重新安装PowerShell 7最新版安装包会自动覆盖旧版本。二是有些极限优化工具会把“Windows远程管理服务”关掉虽然PowerCLI本身不依赖WinRM但PowerShell Gallery模块下载时可能会用到WinRM的一些基础组件如果下载过程中报错可以先确认这个服务和WinHTTP服务是否正常运行。这个问题在单位运维的电脑上出现过排查了半天最后发现是优化工具把WinRM相关的服务禁用了。6. 一些心得PowerCLI的学习路径建议写到最后分享一点我的实际体会。PowerCLI之所以值得花时间学是因为它把运维工作从“鼠标点一点”变成了“写一段文本”。你可以把运维经验沉淀成脚本团队之间共享也可以结合CI/CD流水线做自动化交付虚拟机的创建、配置、销毁整个过程都可以用PowerCLI驱动。我给新手的建议是不要贪多先掌握最基础的三板斧Connect-VIServer连上去Get-VM查虚拟机Get-VMHost查主机。把这几个命令练熟能解决实际环境里一半的查询需求然后用Get-Command -Module VMware.PowerCLI看看它有哪些命令按需去搜具体参数。官方文档写得很好但就是太长了不适合新手从头啃不如边用边查。最后再分享一个小技巧PowerCLI的命令结果本质上是对象不是文本。你可以随时用Get-Member查看一个对象有哪些属性和方法比如执行Get-VM | Get-Member就能看到所有可用字段。学会这个方法之后哪怕遇到一个没接触过的命令也能快速知道它能输出什么、能继续操作什么这个习惯是我觉得进阶路上最重要的一点。
返回列表