如何用Nova Client查询OpenStack主机所属Hypervisor及快速获取含位置的主机列表
一、列出某台主机所运行的Hypervisor
如果你需要查看OpenStack中某台计算节点(主机)对应的Hypervisor详情,按以下步骤操作就可以:
先拿到所有Hypervisor的基础清单,找到目标主机对应的Hypervisor名称或ID:
nova hypervisor-list要是你用的是更现代的OpenStack统一CLI(和Nova Client兼容,功能更全),可以换成:
openstack hypervisor list这个命令会返回所有Hypervisor的ID、名称、状态等基础信息,很容易定位到目标主机。
查询目标Hypervisor的详细信息,用上一步得到的名称或ID就行:
nova hypervisor-show <hypervisor-name-or-id>或者用统一CLI:
openstack hypervisor show <hypervisor-name-or-id>执行后就能看到该Hypervisor的完整信息,比如类型(KVM/QEMU这类)、版本、运行的实例数量、主机IP等。
要是你实际想找的是某个虚拟机实例所在的Hypervisor,可以先查实例的主机信息,再关联过去:
nova show <instance-name-or-id> | grep hypervisor_hostname
拿到hypervisor_hostname之后,再用上面的hypervisor-show命令就能查到对应的Hypervisor详情了。
二、快速获取包含位置信息的Hypervisor主机列表
你说逐个查询每个Hypervisor要花好几分钟,这太低效了——批量获取才是最快的解决方案,这里有两种实用方法:
方法1:用CLI一次性拉取详细列表
直接带--detail参数执行命令,一次请求就能拿到所有Hypervisor的完整信息,包括位置相关的字段(比如可用区、主机IP、自定义的物理位置元数据等):
nova hypervisor-list --detail
用统一CLI的话,换成--long参数:
openstack hypervisor list --long
如果只需要特定的位置相关字段,还可以用--fields参数自定义输出,减少冗余数据,速度会更快:
openstack hypervisor list --fields name,availability_zone,host_ip,location
注:location字段如果是你自定义的Hypervisor元数据,得确保OpenStack环境里已经配置了这个字段;要是指的是可用区,直接用availability_zone就够了。
方法2:调用Nova API批量查询
如果要写脚本自动化处理,直接调用Nova的API接口是最高效的。发送一个GET请求到:
GET /v2.1/os-hypervisors/detail
这个接口会一次性返回所有Hypervisor的详细信息,不用逐个请求。你可以用curl快速测试:
curl -H "X-Auth-Token: <你的认证令牌>" <Nova API地址>/v2.1/os-hypervisors/detail
返回的JSON数据里包含所有需要的信息,用jq工具还能快速过滤出位置相关字段:
curl -H "X-Auth-Token: <你的认证令牌>" <Nova API地址>/v2.1/os-hypervisors/detail | jq '.hypervisors[] | {主机名: .hypervisor_hostname, 可用区: .availability_zone, 主机IP: .host_ip}'
这两种方法都能避免逐个查询的低效问题,几秒内就能拿到所有Hypervisor的位置信息清单。
内容的提问来源于stack exchange,提问作者cmcginty

