|
|
51CTO旗下网站
|
|
移动端

VMware环境中根据虚拟机IP找寻所在ESXi主机

在VMware vSphere虚拟环境中我们有时需要找寻某IP所在的虚拟机及ESXi宿主机。若VMware虚拟机安装了VMware tools, 则可以通过API直接查找该IP所在位置,但我们的环境中并不是所有的虚拟机都已安装,因而我们只能通过MAC地址来查找。

作者:Just For Coding来源:just4coding博客|2017-10-16 14:42

【51CTO技术沙龙】10月27日,让我们共同探索AI场景化应用实现之道

在VMware vSphere虚拟环境中我们有时需要找寻某IP所在的虚拟机及ESXi宿主机。若VMware虚拟机安装了VMware tools, 则可以通过API直接查找该IP所在位置,但我们的环境中并不是所有的虚拟机都已安装,因而我们只能通过MAC地址来查找。

假设目标IP为10.95.48.11,首先我们从与目标IP位于相同二层网络内的虚拟机上获取10.95.48.11对应的MAC地址:

  1. [root@localhost ~]# ping 10.95.48.11 -c 2 
  2. PING 10.95.48.11 (10.95.48.11) 56(84) bytes of data. 
  3. 64 bytes from 10.95.48.11: icmp_seq=1 ttl=64 time=0.141 ms 
  4. 64 bytes from 10.95.48.11: icmp_seq=2 ttl=64 time=0.137 ms 
  5.  
  6. --- 10.95.48.11 ping statistics --- 
  7. 2 packets transmitted, 2 received, 0% packet loss, time 999ms 
  8. rtt min/avg/max/mdev = 0.137/0.139/0.141/0.002 ms 
  9. [root@localhost ~]# ip neighbor |grep 10.95.48.11 
  10. 10.95.48.11 dev eth0 lladdr 00:0c:29:26:18:c8 REACHABLE 

获取到MAC地址为00:0c:29:26:18:c8。

若是环境中ESXi主机较少,可以通过SSH直接登录ESXi主机挨个进行查找。

首先进入虚拟机的存储目录,不同环境中数据存储的名字可能不同:

  1. cd /vmfs/volumes/datastore1/ 

该目录存储的是各个虚拟机的相关文件,一个虚拟机对应一个目录,如:

  1. [root@esxi-01:/vmfs/volumes/595b7497-d8849df8-8d7c-6c92bf585d10] ls -l 
  2. total 176 
  3. drwxr-xr-x    1 root     root           420 Sep 14 02:30 centos-68 
  4. drwxr-xr-x    1 root     root          1820 Oct  9 09:55 dev01-10.95.48.11 
  5. drwxr-xr-x    1 root     root          3080 Sep 14 03:37 dev02-10.95.48.12 

每台虚拟机目录中的vmx文件中存储了系统为虚拟网卡生成的MAC地址,如:

  1. ethernet0.generatedAddress = "00:0c:29:26:18:c8" 
  2. ethernet0.generatedAddressOffset = "0" 

我们可以从vmx文件中搜索MAC地址,找到相应的虚拟机,如:

  1. [root@esxi-01:/vmfs/volumes/595b7497-d8849df8-8d7c-6c92bf585d10] find . -name '*.vmx' | xargs grep '00:0c:29:26:18:c8' 
  2. ./dev01-10.95.48.11/dev01-10.95.48.11.vmx:ethernet0.generatedAddress = "00:0c:29:26:18:c8” 

若是环境中ESXi主机非常多,一台一台搜索非常低效,我们可以基于VMware官方提供的SDK来编写程序来找到相应的MAC地址。

VMware提供了Python的SDK: https://github.com/vmware/pyvmomi

我们编写的程序如下:

  1. #!/usr/bin/env python 
  2. import atexit 
  3.  
  4. from pyVim import connect 
  5. from pyVmomi import vmodl 
  6. from pyVmomi import vim 
  7.  
  8. def print_vm_info(virtual_machine): 
  9.     for device in virtual_machine.config.hardware.device: 
  10.         if (device.key >= 4000) and (device.key < 5000): 
  11.             if device.macAddress == '00:0c:29:26:18:c8'
  12.                 print('device.macAddress==', device.macAddress) 
  13.  
  14.                 summary = virtual_machine.summary 
  15.                 print("Name       : ", summary.config.name
  16.                 print("Template   : ", summary.config.template) 
  17.                 print("Path       : ", summary.config.vmPathName) 
  18.                 print("Guest      : ", summary.config.guestFullName) 
  19.                 print("Host       : ", summary.runtime.host.name
  20.  
  21. def main(): 
  22.     try: 
  23.         service_instance = connect.SmartConnect(host="10.10.10.10"
  24.                                                 user="administrator@vsphere.local"
  25.                                                 pwd="123456"
  26.                                                 port=443) 
  27.  
  28.         atexit.register(connect.Disconnect, service_instance) 
  29.  
  30.         content = service_instance.RetrieveContent() 
  31.  
  32.         container = content.rootFolder  # starting point to look into 
  33.         viewType = [vim.VirtualMachine]  # object types to look for 
  34.         recursive = True  # whether we should look into it recursively 
  35.         containerView = content.viewManager.CreateContainerView( 
  36.             container, viewType, recursive) 
  37.  
  38.         children = containerView.view 
  39.         for child in children: 
  40.             print_vm_info(child) 
  41.  
  42.     except vmodl.MethodFault as error: 
  43.         print("Caught vmodl fault : " + error.msg) 
  44.         return -1 
  45.  
  46.     return 0 
  47.  
  48. # Start program 
  49. if __name__ == "__main__"
  50.     main() 

虚拟机的设备key值位于4000-5000表示网络设备,我们在网络设备的属性中查找MAC信息。程序中的连接信息可以是ESXi主机信息,也可以是vCenter信息。直接连接vCenter则可以将环境中所有ESXi主机全部搜索完, 避免一台一台主机搜索。

程序的执行结果,如下:

  1. [root@vagrant-centos65 samples]# python get_vm_from_mac.py  
  2. ('device.macAddress==''00:0c:29:26:18:c8'
  3. ('Name       : ''dev01-10.95.48.11'
  4. ('Template   : 'False
  5. ('Path       : ''[datastore1] dev01-10.95.48.11/dev01-10.95.48.11.vmx'
  6. ('Guest      : ''CentOS 4/5/6/7 (64-bit)'
  7. ('Host       : ', ‘esxi-01’) 

【编辑推荐】

  1. VMware将NSX与容器结合 进一步提升安全性能
  2. 如何利用 VMWare 搭建随机拓扑网络
  3. Java 虚拟机 OpenJ9 和 Hotspot 的 Benchmark 测试
  4. 虚拟机粒度的灾难恢复存在哪些挑战?
  5. VMware VAIO为Veeam Continuous Data Protection建立框架
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Linux安全体系分析与编程

本书选择经典的开放源代码,全面系统地分析了Linux安全机制。本书共有17章,前10章着重介绍了Linux操作系统的安全机制及实现方法,阐述了公...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊