为何vmware-cmd对接vCenter需指定目标主机?如何无ESX信息列虚拟机?
vCenter环境下vmware-cmd与PowerCLI查询虚拟机的差异及SSH替代方案
为什么vmware-cmd需要指定ESXi主机,而PowerCLI不用?
咱们先拆解这俩工具的定位和工作逻辑:
- VMware PowerCLI是专门针对vSphere生态设计的现代化PowerShell模块,核心是直接和vCenter Server通信。vCenter作为整个虚拟化环境的统一管理入口,已经聚合了所有关联ESXi主机的资源信息(包括虚拟机、存储、网络等)。所以当你用正确凭据连接vCenter后,
Get-VM命令本质是向vCenter请求全量虚拟机列表,vCenter会直接返回它管理的所有VM,自然不需要你指定具体的ESXi主机。 - vmware-cmd是个比较老旧的命令行工具,它的设计初衷是直接和单个ESXi主机交互,而非对接vCenter。这个工具没有集成与vCenter通信的能力,无法从vCenter获取整个环境的资源拓扑,所以必须指定具体的ESXi主机地址,才能查询该主机上注册的虚拟机列表。简单说,它是“单机工具”,而PowerCLI是“全局管理工具”。
未知ESXi主机时,不用PowerCLI怎么通过SSH查虚拟机列表?
如果不知道关联的ESXi主机,咱们可以直接通过SSH连接到vCenter Server(这里以VCSA为例,Windows版vCenter也支持开启SSH),用以下几种方法实现:
方法1:使用vSphere REST API(无需额外安装工具)
VCSA默认自带curl,可以直接调用vSphere的REST API来获取虚拟机列表:
- 先获取会话认证token:
curl -k -X POST -H "Content-Type: application/json" -d '{"username":"你的vCenter用户名","password":"你的vCenter密码"}' https://你的vCenter地址/rest/com/vmware/cis/session
(-k参数用于忽略自签名证书的验证,如果vCenter用的是可信证书可以去掉)
2. 用返回的value字段作为token,调用VM列表接口:
curl -k -H "vmware-api-session-id: 上面获取的token值" https://你的vCenter地址/rest/vcenter/vm
返回的JSON数据里包含所有虚拟机的名称、ID、状态等信息,你可以用jq(VCSA默认预装)来格式化输出:
curl -k -H "vmware-api-session-id: 你的token" https://你的vCenter地址/rest/vcenter/vm | jq '.value[] | {name: .name, power_state: .power_state}'
方法2:使用govc工具(轻量级vSphere CLI)
govc是VMware官方推出的轻量级命令行工具,VCSA一般预装了这个工具,如果没有的话也可以快速安装:
- 先配置vCenter连接参数:
export GOVC_URL='https://你的vCenter地址/sdk' export GOVC_USERNAME='你的vCenter用户名' export GOVC_PASSWORD='你的vCenter密码' export GOVC_INSECURE=true # 忽略自签名证书验证
- 直接执行命令列出所有虚拟机:
govc vm.ls
这个命令会返回所有vCenter管理的虚拟机,和PowerCLI的Get-VM效果类似,还可以加参数过滤,比如只看开机的VM:
govc vm.ls -on
方法3:使用Python脚本调用vSphere API
VCSA默认预装了pyVim和pyVmomi模块,可以写个简单的脚本查询:
from pyVim.connect import SmartConnect, Disconnect import ssl # 忽略证书验证(自签名证书场景) ssl_context = ssl._create_unverified_context() # 连接vCenter service_instance = SmartConnect( host="你的vCenter地址", user="你的vCenter用户名", pwd="你的vCenter密码", sslContext=ssl_context ) # 获取虚拟机列表 content = service_instance.RetrieveContent() container = content.viewManager.CreateContainerView(content.rootFolder, [content.vmFolder], True) virtual_machines = container.view # 打印虚拟机名称 print("所有虚拟机列表:") for vm in virtual_machines: print(f"- {vm.name}") # 断开连接 Disconnect(service_instance)
把脚本保存为list_vms.py,然后执行:
python3 list_vms.py
内容的提问来源于stack exchange,提问作者Parag Doke
相关产品推荐
相关产品推荐

