VMware環(huán)境中根據(jù)虛擬機(jī)IP找尋所在ESXi主機(jī)
在VMware vSphere虛擬環(huán)境中我們有時(shí)需要找尋某IP所在的虛擬機(jī)及ESXi宿主機(jī)。若VMware虛擬機(jī)安裝了VMware tools, 則可以通過(guò)API直接查找該IP所在位置,但我們的環(huán)境中并不是所有的虛擬機(jī)都已安裝,因而我們只能通過(guò)MAC地址來(lái)查找。
假設(shè)目標(biāo)IP為10.95.48.11,首先我們從與目標(biāo)IP位于相同二層網(wǎng)絡(luò)內(nèi)的虛擬機(jī)上獲取10.95.48.11對(duì)應(yīng)的MAC地址:
- [root@localhost ~]# ping 10.95.48.11 -c 2
- PING 10.95.48.11 (10.95.48.11) 56(84) bytes of data.
- 64 bytes from 10.95.48.11: icmp_seq=1 ttl=64 time=0.141 ms
- 64 bytes from 10.95.48.11: icmp_seq=2 ttl=64 time=0.137 ms
- --- 10.95.48.11 ping statistics ---
- 2 packets transmitted, 2 received, 0% packet loss, time 999ms
- rtt min/avg/max/mdev = 0.137/0.139/0.141/0.002 ms
- [root@localhost ~]# ip neighbor |grep 10.95.48.11
- 10.95.48.11 dev eth0 lladdr 00:0c:29:26:18:c8 REACHABLE
獲取到MAC地址為00:0c:29:26:18:c8。
若是環(huán)境中ESXi主機(jī)較少,可以通過(guò)SSH直接登錄ESXi主機(jī)挨個(gè)進(jìn)行查找。
首先進(jìn)入虛擬機(jī)的存儲(chǔ)目錄,不同環(huán)境中數(shù)據(jù)存儲(chǔ)的名字可能不同:
- cd /vmfs/volumes/datastore1/
該目錄存儲(chǔ)的是各個(gè)虛擬機(jī)的相關(guān)文件,一個(gè)虛擬機(jī)對(duì)應(yīng)一個(gè)目錄,如:
- [root@esxi-01:/vmfs/volumes/595b7497-d8849df8-8d7c-6c92bf585d10] ls -l
- total 176
- drwxr-xr-x 1 root root 420 Sep 14 02:30 centos-68
- drwxr-xr-x 1 root root 1820 Oct 9 09:55 dev01-10.95.48.11
- drwxr-xr-x 1 root root 3080 Sep 14 03:37 dev02-10.95.48.12
每臺(tái)虛擬機(jī)目錄中的vmx文件中存儲(chǔ)了系統(tǒng)為虛擬網(wǎng)卡生成的MAC地址,如:
- ethernet0.generatedAddress = "00:0c:29:26:18:c8"
- ethernet0.generatedAddressOffset = "0"
我們可以從vmx文件中搜索MAC地址,找到相應(yīng)的虛擬機(jī),如:
- [root@esxi-01:/vmfs/volumes/595b7497-d8849df8-8d7c-6c92bf585d10] find . -name '*.vmx' | xargs grep '00:0c:29:26:18:c8'
- ./dev01-10.95.48.11/dev01-10.95.48.11.vmx:ethernet0.generatedAddress = "00:0c:29:26:18:c8”
若是環(huán)境中ESXi主機(jī)非常多,一臺(tái)一臺(tái)搜索非常低效,我們可以基于VMware官方提供的SDK來(lái)編寫(xiě)程序來(lái)找到相應(yīng)的MAC地址。
VMware提供了Python的SDK: https://github.com/vmware/pyvmomi
我們編寫(xiě)的程序如下:
- #!/usr/bin/env python
- import atexit
- from pyVim import connect
- from pyVmomi import vmodl
- from pyVmomi import vim
- def print_vm_info(virtual_machine):
- for device in virtual_machine.config.hardware.device:
- if (device.key >= 4000) and (device.key < 5000):
- if device.macAddress == '00:0c:29:26:18:c8':
- print('device.macAddress==', device.macAddress)
- summary = virtual_machine.summary
- print("Name : ", summary.config.name)
- print("Template : ", summary.config.template)
- print("Path : ", summary.config.vmPathName)
- print("Guest : ", summary.config.guestFullName)
- print("Host : ", summary.runtime.host.name)
- def main():
- try:
- service_instance = connect.SmartConnect(host="10.10.10.10",
- user="administrator@vsphere.local",
- pwd="123456",
- port=443)
- atexit.register(connect.Disconnect, service_instance)
- content = service_instance.RetrieveContent()
- container = content.rootFolder # starting point to look into
- viewType = [vim.VirtualMachine] # object types to look for
- recursive = True # whether we should look into it recursively
- containerView = content.viewManager.CreateContainerView(
- container, viewType, recursive)
- children = containerView.view
- for child in children:
- print_vm_info(child)
- except vmodl.MethodFault as error:
- print("Caught vmodl fault : " + error.msg)
- return -1
- return 0
- # Start program
- if __name__ == "__main__":
- main()
虛擬機(jī)的設(shè)備key值位于4000-5000表示網(wǎng)絡(luò)設(shè)備,我們?cè)诰W(wǎng)絡(luò)設(shè)備的屬性中查找MAC信息。程序中的連接信息可以是ESXi主機(jī)信息,也可以是vCenter信息。直接連接vCenter則可以將環(huán)境中所有ESXi主機(jī)全部搜索完, 避免一臺(tái)一臺(tái)主機(jī)搜索。
程序的執(zhí)行結(jié)果,如下:
- [root@vagrant-centos65 samples]# python get_vm_from_mac.py
- ('device.macAddress==', '00:0c:29:26:18:c8')
- ('Name : ', 'dev01-10.95.48.11')
- ('Template : ', False)
- ('Path : ', '[datastore1] dev01-10.95.48.11/dev01-10.95.48.11.vmx')
- ('Guest : ', 'CentOS 4/5/6/7 (64-bit)')
- ('Host : ', ‘esxi-01’)