如何调用VMware API实现虚拟机标签与IP地址的关联查询
实现VMware虚拟机标签与IP地址关联的方案
存在可实现该需求的API,你只需要组合vSphere REST API的两类接口返回结果,即可完成标签与虚拟机IP的关联匹配。
核心逻辑
你当前调用的
cis/tagging/tag接口仅能返回所有标签的元数据,无法直接得到标签和资源的绑定关系。需要组合三类接口的返回结果做映射:
- 标签元数据接口:获取标签ID和标签内容(如
app=db)的对应关系- 标签关联接口:获取每个标签绑定的虚拟机资源ID
- 虚拟机清单接口:获取虚拟机ID和对应IP地址的映射关系
具体实现步骤
步骤1:处理标签元数据映射
你现有的代码已经拿到了所有标签ID,进一步处理为标签ID:标签内容的映射字典,方便后续查询:
vsession = self.vCenterSession() all_tags = vsession.get('https://10.156.0.10/rest/com/vmware/cis/tagging/tag') all_tags_py = json.loads(all_tags.text)['value'] # 构建标签ID与标签内容的映射 tag_map = {} for tag_id in all_tags_py: tag_detail = json.loads(vsession.get(f'https://10.156.0.10/rest/com/vmware/cis/tagging/tag/id:{tag_id}').text)['value'] tag_map[tag_id] = tag_detail['name']
步骤2:查询标签绑定的虚拟机资源
调用标签关联接口,获取每个标签绑定的虚拟机ID,构建虚拟机ID:标签列表的映射:
vm_tag_bind = {} for tag_id, tag_content in tag_map.items(): req_data = {"tag_id": tag_id} attach_resp = vsession.post( 'https://10.156.0.10/rest/com/vmware/cis/tagging/tag_association/list-attached-objects', json=req_data ) attach_objs = json.loads(attach_resp.text)['value'] for obj in attach_objs: # 仅过滤类型为虚拟机的绑定资源 if obj['type'] == 'VirtualMachine': vm_id = obj['id'] if vm_id not in vm_tag_bind: vm_tag_bind[vm_id] = [] vm_tag_bind[vm_id].append(tag_content)
步骤3:查询虚拟机IP并完成关联
调用虚拟机清单接口获取所有虚拟机的ID、IP等属性,和上一步得到的标签映射做匹配:
vm_resp = vsession.get('https://10.156.0.10/rest/vcenter/vm') all_vm_info = json.loads(vm_resp.text)['value'] # 最终关联结果 result = [] for vm in all_vm_info: vm_id = vm['vm'] result.append({ "虚拟机名称": vm['name'], "IP地址": vm.get('guest_ip_address', '未获取到'), "关联标签": vm_tag_bind.get(vm_id, []) })
注意事项
- 调用API的账号需要同时拥有虚拟机只读权限和标签只读权限
- 虚拟机IP需要虚拟机内部的VMware Tools正常运行才能被vCenter采集到,否则会返回空值
- 如果需要获取多网卡的详细IP信息,可以调用单虚拟机的网卡查询接口:
https://10.156.0.10/rest/vcenter/vm/{虚拟机ID}/guest/networking/interfaces
内容的提问来源于stack exchange,提问作者Rewanta Subba
相关产品推荐
相关产品推荐

