Python 获取EXSI宿主机上虚拟机数据

 以下从 Vsphere 导出的数据的 Class 是根据此文提供的代码改写,感谢原作者现成儿的代码为我节省了时间

参考地址: Python 获取EXSI宿主机上虚拟机数据 - 一毛丶丶 - 博客园

from django.test import TestCase
from pyVmomi import vim
from pyVim.connect import SmartConnect, Disconnect, SmartConnectNoSSL
import atexit


class ExportVsphereData(object):
    """从Vsphere导出数据"""
    def get_obj(self, content, vimtype):
        """列表返回,name 可以指定匹配的对象"""
        container = content.viewManager.CreateContainerView(content.rootFolder, vimtype, True)
        obj = [view for view in container.view]
        return obj

    def export_vsphere(self, host, port, user, password):
        num = 0
        esxi_host_list = []
        # 登录Vsphere
        si = SmartConnectNoSSL(
            host=host,
            user=user,
            pwd=password,
            port=port)
        # disconnect this thing
        atexit.register(Disconnect, si)
        content = si.RetrieveContent()
        esxi_obj = self.get_obj(content, [vim.HostSystem])
        for esxi in esxi_obj:
            num = num + 1
            print("宿主机数量--->", num)
            esxi_host = {}
            esxi_host[esxi.name] = {'esxi_info': {}, 'datastore': {}, 'network': {}, 'vm': {}}

            esxi_host[esxi.name]['esxi_info']['厂商'] = esxi.summary.hardware.vendor
            esxi_host[esxi.name]['esxi_info']['型号'] = esxi.summary.hardware.model
            for i in esxi.summary.hardware.otherIdentifyingInfo:
                if isinstance(i, vim.host.SystemIdentificationInfo):
                    esxi_host[esxi.name]['esxi_info']['SN'] = i.identifierValue
            esxi_host[esxi.name]['esxi_info']['处理器'] = '数量:%s 核数:%s 线程数:%s 频率:%s(%s) ' % (esxi.summary.hardware.numCpuPkgs,
                                                                                          esxi.summary.hardware.numCpuCores,
                                                                                          esxi.summary.hardware.numCpuThreads,
                                                                                          esxi.summary.hardware.cpuMhz,
                                                                                          esxi.summary.hardware.cpuModel)
            esxi_host[esxi.name]['esxi_info']['处理器使用率'] = '%.1f%%' % (esxi.summary.quickStats.overallCpuUsage /
                                                                      (
                                                                                  esxi.summary.hardware.numCpuPkgs * esxi.summary.hardware.numCpuCores * esxi.summary.hardware.cpuMhz) * 100)
            esxi_host[esxi.name]['esxi_info']['内存(MB)'] = esxi.summary.hardware.memorySize / 1024 / 1024
            esxi_host[esxi.name]['esxi_info']['可用内存(MB)'] = '%.1f MB' % (
                        (esxi.summary.hardware.memorySize / 1024 / 1024) - esxi.summary.quickStats.overallMemoryUsage)
            esxi_host[esxi.name]['esxi_info']['内存使用率'] = '%.1f%%' % ((esxi.summary.quickStats.overallMemoryUsage / (
                        esxi.summary.hardware.memorySize / 1024 / 1024)) * 100)
            esxi_host[esxi.name]['esxi_info']['系统'] = esxi.summary.config.product.fullName

            for ds in esxi.datastore:
                esxi_host[esxi.name]['datastore'][ds.name] = {}
                esxi_host[esxi.name]['datastore'][ds.name]['总容量(G)'] = int((ds.summary.capacity) / 1024 / 1024 / 1024)
                esxi_host[esxi.name]['datastore'][ds.name]['空闲容量(G)'] = int((ds.summary.freeSpace) / 1024 / 1024 / 1024)
                esxi_host[esxi.name]['datastore'][ds.name]['类型'] = (ds.summary.type)
            for nt in esxi.network:
                esxi_host[esxi.name]['network'][nt.name] = {}
                esxi_host[esxi.name]['network'][nt.name]['标签ID'] = nt.name
            for vm in esxi.vm:
                esxi_host[esxi.name]['vm'][vm.name] = {}
                esxi_host[esxi.name]['vm'][vm.name]['电源状态'] = vm.runtime.powerState
                esxi_host[esxi.name]['vm'][vm.name]['CPU(内核总数)'] = vm.config.hardware.numCPU
                esxi_host[esxi.name]['vm'][vm.name]['内存(总数MB)'] = vm.config.hardware.memoryMB
                esxi_host[esxi.name]['vm'][vm.name]['系统信息'] = vm.config.guestFullName
                if vm.guest.ipAddress:
                    esxi_host[esxi.name]['vm'][vm.name]['IP'] = vm.guest.ipAddress
                else:
                    esxi_host[esxi.name]['vm'][vm.name]['IP'] = '服务器需要开机后才可以获取'

                for d in vm.config.hardware.device:
                    if isinstance(d, vim.vm.device.VirtualDisk):
                        esxi_host[esxi.name]['vm'][vm.name][d.deviceInfo.label] = str(
                            (d.capacityInKB) / 1024 / 1024) + ' GB'
            esxi_host_list.append(esxi_host)
        return esxi_host_list


if __name__ == "__main__":
    host = "192.168.5.65"
    port = "443"
    user = "[email protected]"
    password = "sfH$KJHgj6o(:Lkj"
    ed = ExportVsphereData()
    data = ed.export_vsphere(host, port, user, password)
    print(data)

执行后,可获取到的数据格式如下。

[{
	'192.168.60.140': {
		'esxi_info': {
			'厂商': 'Dell Inc.',
			'型号': 'PowerEdge R630',
			'SN': '19[?]',
			'处理器': '数量:1 核数:8 线程数:16 频率:2099(Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz) ',
			'处理器使用率': '14.9%',
			'内存(MB)': 130978.26953125,
			'可用内存(MB)': '30246.3 MB',
			'内存使用率': '76.9%',
			'系统': 'VMware ESXi 6.7.0 build-8169922'
		},
		'datastore': {
			'datastore1 (2)': {
				'总容量(G)': 3901,
				'空闲容量(G)': 729,
				'类型': 'VMFS'
			}
		},
		'network': {
			'VM Network': {
				'标签ID': 'VM Network'
			}
		},
		'vm': {
			'192.168.60.158-k8s-node': {
				'电源状态': 'poweredOn',
				'CPU(内核总数)': 16,
				'内存(总数MB)': 32768,
				'系统信息': 'CentOS 7 (64 位)',
				'IP': '192.168.60.158',
				'硬盘 1': '50.0 GB',
				'硬盘 2': '500.0 GB'
			},
			'192.168.60.161-dev-app-01': {
				'电源状态': 'poweredOn',
				'CPU(内核总数)': 16,
				'内存(总数MB)': 49152,
				'系统信息': 'CentOS 7 (64 位)',
				'IP': '192.168.60.161',
				'硬盘 1': '50.0 GB',
				'硬盘 2': '500.0 GB',
				'硬盘 3': '1024.0 GB',
				'硬盘 4': '100.0 GB'
			},
			'192.168.60.248-dev-app': {
				'电源状态': 'poweredOn',
				'CPU(内核总数)': 4,
				'内存(总数MB)': 8192,
				'系统信息': 'CentOS 7 (64 位)',
				'IP': '192.168.60.248',
				'硬盘 1': '50.0 GB',
				'硬盘 2': '200.0 GB'
			},
			'192.168.60.249-dev-DB': {
				'电源状态': 'poweredOn',
				'CPU(内核总数)': 4,
				'内存(总数MB)': 8192,
				'系统信息': 'Microsoft Windows Server 2012 (64 位)',
				'IP': '服务器需要开机后才可以获取',
				'硬盘 1': '100.0 GB',
				'硬盘 2': '500.0 GB'
			}
		}
	}
}, {
	'192.168.60.130': {
		'esxi_info': {
			'厂商': 'Dell Inc.',
			'型号': 'PowerEdge R620',
			'SN': '17[FFFFFFFFFFFFFFFF]',
			'处理器': '数量:2 核数:20 线程数:40 频率:2199(Intel(R) Xeon(R) CPU E5-2660 v2 @ 2.20GHz) ',
			'处理器使用率': '19.7%',
			'内存(MB)': 131026.47265625,
			'可用内存(MB)': '6098.5 MB',
			'内存使用率': '95.3%',
			'系统': 'VMware ESXi 6.7.0 build-8169922'
		},
		'datastore': {
			'datastore1 (1)': {
				'总容量(G)': 3344,
				'空闲容量(G)': 2114,
				'类型': 'VMFS'
			}
		},
		'network': {
			'VM Network': {
				'标签ID': 'VM Network'
			}
		},
		'vm': {
			'192.168.60.156-k8s-node': {
				'电源状态': 'poweredOn',
				'CPU(内核总数)': 8,
				'内存(总数MB)': 32768,
				'系统信息': 'CentOS 7 (64 位)',
				'IP': '192.168.60.156',
				'硬盘 1': '50.0 GB',
				'硬盘 2': '200.0 GB'
			},
			'192.168.60.153-k8s-node': {
				'电源状态': 'poweredOn',
				'CPU(内核总数)': 8,
				'内存(总数MB)': 32768,
				'系统信息': 'CentOS 7 (64 位)',
				'IP': '192.168.60.153',
				'硬盘 1': '50.0 GB',
				'硬盘 2': '300.0 GB'
			},
			'192.168.60.157-k8s-node': {
				'电源状态': 'poweredOn',
				'CPU(内核总数)': 8,
				'内存(总数MB)': 32768,
				'系统信息': 'CentOS 7 (64 位)',
				'IP': '192.168.60.157',
				'硬盘 1': '50.0 GB',
				'硬盘 2': '200.0 GB'
			},
			'192.168.60.155-k8s-node': {
				'电源状态': 'poweredOn',
				'CPU(内核总数)': 8,
				'内存(总数MB)': 32768,
				'系统信息': 'CentOS 7 (64 位)',
				'IP': '192.168.60.155',
				'硬盘 1': '50.0 GB',
				'硬盘 2': '200.0 GB'
			}
		}
	}
}, {
	'192.168.60.60': {
		'esxi_info': {
			'厂商': 'Dell Inc.',
			'型号': 'PowerEdge R620',
			'SN': '17[FFFFFFFFFFFFFFFF]',
			'处理器': '数量:2 核数:20 线程数:40 频率:2199(Intel(R) Xeon(R) CPU E5-2660 v2 @ 2.20GHz) ',
			'处理器使用率': '16.3%',
			'内存(MB)': 131026.47265625,
			'可用内存(MB)': '6951.5 MB',
			'内存使用率': '94.7%',
			'系统': 'VMware ESXi 6.7.0 build-8169922'
		},
		'datastore': {
			'datastore1': {
				'总容量(G)': 3344,
				'空闲容量(G)': 2214,
				'类型': 'VMFS'
			}
		},
		'network': {
			'VM Network': {
				'标签ID': 'VM Network'
			}
		},
		'vm': {
			'192.168.60.148-k8s-node': {
				'电源状态': 'poweredOn',
				'CPU(内核总数)': 8,
				'内存(总数MB)': 32768,
				'系统信息': 'CentOS 7 (64 位)',
				'IP': '192.168.60.148',
				'硬盘 1': '50.0 GB',
				'硬盘 2': '200.0 GB'
			},
			'192.168.60.154-k8s-node': {
				'电源状态': 'poweredOn',
				'CPU(内核总数)': 12,
				'内存(总数MB)': 32768,
				'系统信息': 'CentOS 7 (64 位)',
				'IP': '192.168.60.154',
				'硬盘 1': '50.0 GB',
				'硬盘 2': '200.0 GB'
			},
			'192.168.60.149-k8s-node': {
				'电源状态': 'poweredOn',
				'CPU(内核总数)': 8,
				'内存(总数MB)': 32768,
				'系统信息': 'CentOS 7 (64 位)',
				'IP': '192.168.60.149',
				'硬盘 1': '50.0 GB',
				'硬盘 2': '200.0 GB'
			},
			'192.168.60.151-k8s-node': {
				'电源状态': 'poweredOn',
				'CPU(内核总数)': 8,
				'内存(总数MB)': 32768,
				'系统信息': 'CentOS 7 (64 位)',
				'IP': '192.168.60.151',
				'硬盘 1': '50.0 GB',
				'硬盘 2': '200.0 GB'
			}
		}
	}
}, {
	'192.168.60.70': {
		'esxi_info': {
			'厂商': 'Dell Inc.',
			'型号': 'PowerEdge R630',
			'SN': '19[?]',
			'处理器': '数量:1 核数:8 线程数:16 频率:2100(Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz) ',
			'处理器使用率': '56.1%',
			'内存(MB)': 130978.26953125,
			'可用内存(MB)': '6395.3 MB',
			'内存使用率': '95.1%',
			'系统': 'VMware ESXi 6.7.0 build-8169922'
		},
		'datastore': {
			'192.168.60.70-ST-2.72TB': {
				'总容量(G)': 2784,
				'空闲容量(G)': 1653,
				'类型': 'VMFS'
			}
		},
		'network': {
			'VM Network': {
				'标签ID': 'VM Network'
			}
		},
		'vm': {
			'192.168.60.135-k8s-node': {
				'电源状态': 'poweredOn',
				'CPU(内核总数)': 8,
				'内存(总数MB)': 32768,
				'系统信息': 'CentOS 7 (64 位)',
				'IP': '192.168.60.135',
				'硬盘 1': '50.0 GB',
				'硬盘 2': '200.0 GB'
			},
			'192.168.60.147-k8s-node': {
				'电源状态': 'poweredOn',
				'CPU(内核总数)': 8,
				'内存(总数MB)': 32768,
				'系统信息': 'CentOS 7 (64 位)',
				'IP': '192.168.60.147',
				'硬盘 1': '50.0 GB',
				'硬盘 2': '200.0 GB'
			},
			'192.168.60.145-k8s-node': {
				'电源状态': 'poweredOn',
				'CPU(内核总数)': 8,
				'内存(总数MB)': 32768,
				'系统信息': 'CentOS 7 (64 位)',
				'IP': '192.168.60.145',
				'硬盘 1': '50.0 GB',
				'硬盘 2': '200.0 GB'
			},
			'192.168.60.146-k8s-node': {
				'电源状态': 'poweredOn',
				'CPU(内核总数)': 8,
				'内存(总数MB)': 32768,
				'系统信息': 'CentOS 7 (64 位)',
				'IP': '192.168.60.146',
				'硬盘 1': '50.0 GB',
				'硬盘 2': '200.0 GB'
			}
		}
	}
}]

如果要合到运维平台之类的,需要将数据写入到数据库。下方是我写到运维平台时,修改后的数据格式,和 django ORM 建表 class

ORM 建表 class

class PhysicsConfigMess(models.Model):
    """物理机配置详细信息"""
    id = models.AutoField(primary_key=True, help_text="自增长ID")
    physics_id = models.CharField(max_length=32, help_text="自生成id")
    physics_ip = models.CharField(max_length=15, help_text="物理机IP", verbose_name="物理机IP")
    manufacturer = models.CharField(max_length=50, help_text="物理机生产厂商", verbose_name="物理机生产厂商")
    production_model = models.CharField(max_length=50, help_text="物理机型号", verbose_name="物理机型号")
    sn = models.CharField(max_length=20, help_text="物理机SN号", verbose_name="物理机SN号")
    cpu_sum = models.IntegerField(default=0, null=True, help_text="CPU数量")
    cpu_kernel = models.IntegerField(default=0, null=True, help_text="CPU物理核数")
    cpu_process = models.IntegerField(default=0, null=True, help_text="CPU逻辑核数")
    cpu_model = models.CharField(max_length=100, help_text="CPU型号", verbose_name="CPU型号")
    cpu_utilization = models.CharField(max_length=50, help_text="cpu使用率", verbose_name="cpu使用率")
    mem_size = models.IntegerField(default=0, null=True, help_text="内存大小")
    mem_utilization = models.CharField(max_length=50, help_text="内存使用率", verbose_name="内存使用率")
    disk_size = models.CharField(max_length=100, help_text="磁盘大小", verbose_name="磁盘大小")
    disk_free_size = models.CharField(max_length=100, help_text="磁盘剩余大小", verbose_name="磁盘剩余大小")
    os_version = models.CharField(max_length=50, help_text="系统版本", verbose_name="系统版本")
    create_day = models.DateField(default=timezone.now, help_text="创建日期")
    create_date = models.DateTimeField(default=timezone.now, help_text="创建时间")
    update_date = models.DateTimeField(default=timezone.now, help_text="更新时间")

    class Meta:
        db_table = "physics_config_mess"
        verbose_name_plural = "物理机配置信息"


class VirtualMachineConfig(models.Model):
    """虚拟机配置"""
    id = models.AutoField(primary_key=True, help_text="自增长ID")
    physics_id = models.CharField(max_length=32, help_text="自生成id")
    power_status = models.IntegerField(default=1, null=True, help_text="虚拟机电源状态poweredOn/poweredOff")
    cpu_process = models.IntegerField(default=0, null=True, help_text="虚拟机CPU核数")
    mem_size = models.IntegerField(default=0, null=True, help_text="虚拟机内存大小")
    virtual_name = models.CharField(max_length=100, help_text="虚拟机名称", verbose_name="虚拟机名称")
    virtual_ip = models.CharField(max_length=15, help_text="虚拟机IP", verbose_name="虚拟机IP")
    disk_size_list = models.CharField(max_length=100, help_text="虚拟机磁盘列表", verbose_name="虚拟机磁盘列表")
    os_version = models.CharField(max_length=30, help_text="虚拟机系统版本", verbose_name="虚拟机系统版本")
    create_day = models.DateField(default=timezone.now, db_index=True, help_text="创建日期")
    create_date = models.DateTimeField(default=timezone.now, help_text="创建时间")
    update_date = models.DateTimeField(default=timezone.now, help_text="更新时间")

    class Meta:
        db_table = "virtual_machine_config"
        verbose_name_plural = "虚拟机配置"

将之前的导出数据代码改成python标准的字典数据格式, 并且修改了整个字典的数据结构。

from pyVmomi import vim
from pyVim.connect import SmartConnect, Disconnect, SmartConnectNoSSL
import atexit


class ExportVsphereData(object):
    """从Vsphere导出数据"""

    def get_obj(self, content, vimtype):
        """列表返回,name 可以指定匹配的对象"""
        container = content.viewManager.CreateContainerView(content.rootFolder, vimtype, True)
        obj = [view for view in container.view]
        return obj

    def export_vsphere(self, host, port, user, password):
        """格式化虚拟机列表相关数据"""
        num = 0
        esxi_host_list = []
        # 登录Vsphere
        si = SmartConnectNoSSL(
            host=host,
            user=user,
            pwd=password,
            port=port)
        # disconnect this thing
        atexit.register(Disconnect, si)
        content = si.RetrieveContent()
        esxi_obj = self.get_obj(content, [vim.HostSystem])
        for esxi in esxi_obj:
            num = num + 1
            print("宿主机数量--->", num, esxi.name)
            physical_esxi_host = {}

            # 宿主机
            sn = ""
            for i in esxi.summary.hardware.otherIdentifyingInfo:
                if isinstance(i, vim.host.SystemIdentificationInfo):
                    if i.identifierType.key == "ServiceTag":
                        sn = i.identifierType.key
            disk_size_list = []
            disk_free_size_list = []
            for ds in esxi.datastore:
                disk_size_list.append("【{disk_name}: {size}】\n".format(disk_name=ds.name,
                                                                       size=int((ds.summary.capacity) / 1024 / 1024 / 1024)
                                                                       )
                                      )
                disk_free_size_list.append("【{disk_name}: {size}】\n".format(disk_name=ds.name,
                                                                            size=int((ds.summary.freeSpace) / 1024 / 1024 / 1024)
                                                                            )
                                           )
            disk_size = "".join(disk_size_list)
            disk_free_size = "".join(disk_free_size_list)
            physical_esxi_host["physical_host"] = esxi.name
            physical_esxi_host["manufacturer"] = esxi.summary.hardware.vendor
            physical_esxi_host["production_model"] = esxi.summary.hardware.model
            physical_esxi_host["sn"] = sn
            physical_esxi_host["cpu_sum"] = esxi.summary.hardware.numCpuPkgs
            physical_esxi_host["cpu_kernel"] = esxi.summary.hardware.numCpuCores
            physical_esxi_host["cpu_process"] = esxi.summary.hardware.numCpuThreads
            physical_esxi_host["cpu_model"] = "%s(%s)" % (esxi.summary.hardware.cpuMhz, esxi.summary.hardware.cpuModel)
            physical_esxi_host["cpu_utilization"] = "%.1f%%" % (esxi.summary.quickStats.overallCpuUsage
                                                                / (
                                                                            esxi.summary.hardware.numCpuPkgs * esxi.summary.hardware.numCpuCores * esxi.summary.hardware.cpuMhz)
                                                                * 100)
            physical_esxi_host["mem_size"] = round(esxi.summary.hardware.memorySize / 1024 / 1024 / 1024)
            physical_esxi_host["mem_utilization"] = "%.1f%%" % ((esxi.summary.quickStats.overallMemoryUsage
                                                                 / (esxi.summary.hardware.memorySize / 1024 / 1024))
                                                                * 100)
            physical_esxi_host["disk_size"] = disk_size
            physical_esxi_host["disk_free_size"] = disk_free_size
            physical_esxi_host["os_version"] = esxi.summary.config.product.fullName

            # 虚拟机信息
            vm_list = []
            for vm in esxi.vm:
                if vm.guest.ipAddress:
                    virtual_ip = vm.guest.ipAddress
                else:
                    virtual_ip = '服务器需要开机后才可以获取'
                v_disk_size_list = []
                for d in vm.config.hardware.device:
                    if isinstance(d, vim.vm.device.VirtualDisk):
                        v_disk_size_list.append("【{label}: {size}】\n".format(label=d.deviceInfo.label,
                                                                             size=str(
                                                                                (d.capacityInKB) / 1024 / 1024) + "GB"
                                                                             )
                                                )
                v_disk_size_str = "".join(v_disk_size_list)
                power_status = 1 if vm.runtime.powerState == "poweredOn" else 0
                vm_dict = {}
                vm_dict["virtual_name"] = vm.name
                vm_dict["power_status"] = power_status
                vm_dict["cpu_process"] = vm.config.hardware.numCPU
                vm_dict["mem_size"] = vm.config.hardware.memoryMB
                vm_dict["virtual_ip"] = virtual_ip
                vm_dict["disk_size_list"] = v_disk_size_str
                vm_dict["os_version"] = vm.config.guestFullName
                vm_list.append(vm_dict)
            physical_esxi_host["vm"] = vm_list
            print(physical_esxi_host)
            esxi_host_list.append(physical_esxi_host)
            if num == 5:
                break
        return esxi_host_list

得到的数据结构如下

[{
	'physical_host': '192.168.60.80',
	'manufacturer': 'Dell Inc.',
	'production_model': 'PowerEdge R630',
	'sn': 'ServiceTag',
	'cpu_sum': 2,
	'cpu_kernel': 12,
	'cpu_process': 24,
	'cpu_model': '3399(Intel(R) Xeon(R) CPU E5-2643 v4 @ 3.40GHz)',
	'cpu_utilization': '14.5%',
	'mem_size': 128,
	'mem_utilization': '95.5%',
	'disk_size': '【192.168.60.80-ST-3.28TB: 3342】\n',
	'disk_free_size': '【192.168.60.80-ST-3.28TB: 2220】\n',
	'os_version': 'VMware ESXi 6.7.0 build-8169922',
	'vm': [{
		'virtual_name': '192.168.60.141-k8s-node',
		'power_status': 1,
		'cpu_process': 12,
		'mem_size': 24576,
		'virtual_ip': '192.168.60.141',
		'disk_size_list': '【硬盘 1: 50.0GB】\n【硬盘 2: 200.0GB】\n',
		'os_version': 'CentOS 7 (64 位)'
	}, {
		'virtual_name': '192.168.60.137-k8s-node',
		'power_status': 1,
		'cpu_process': 12,
		'mem_size': 32768,
		'virtual_ip': '192.168.60.137',
		'disk_size_list': '【硬盘 1: 50.0GB】\n【硬盘 2: 200.0GB】\n',
		'os_version': 'CentOS 7 (64 位)'
	}, {
		'virtual_name': '192.168.60.139-k8s-node',
		'power_status': 1,
		'cpu_process': 12,
		'mem_size': 32768,
		'virtual_ip': '192.168.60.139',
		'disk_size_list': '【硬盘 1: 50.0GB】\n【硬盘 2: 200.0GB】\n',
		'os_version': 'CentOS 7 (64 位)'
	}, {
		'virtual_name': '192.168.60.138-k8s-node',
		'power_status': 1,
		'cpu_process': 12,
		'mem_size': 32768,
		'virtual_ip': '192.168.60.138',
		'disk_size_list': '【硬盘 1: 50.0GB】\n【硬盘 2: 200.0GB】\n',
		'os_version': 'CentOS 7 (64 位)'
	}]
}, {
	'physical_host': '192.168.60.70',
	'manufacturer': 'Dell Inc.',
	'production_model': 'PowerEdge R630',
	'sn': 'ServiceTag',
	'cpu_sum': 1,
	'cpu_kernel': 8,
	'cpu_process': 16,
	'cpu_model': '2100(Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz)',
	'cpu_utilization': '54.3%',
	'mem_size': 128,
	'mem_utilization': '95.4%',
	'disk_size': '【192.168.60.70-ST-2.72TB: 2784】\n',
	'disk_free_size': '【192.168.60.70-ST-2.72TB: 1653】\n',
	'os_version': 'VMware ESXi 6.7.0 build-8169922',
	'vm': [{
		'virtual_name': '192.168.60.135-k8s-node',
		'power_status': 1,
		'cpu_process': 8,
		'mem_size': 32768,
		'virtual_ip': '192.168.60.135',
		'disk_size_list': '【硬盘 1: 50.0GB】\n【硬盘 2: 200.0GB】\n',
		'os_version': 'CentOS 7 (64 位)'
	}, {
		'virtual_name': '192.168.60.147-k8s-node',
		'power_status': 1,
		'cpu_process': 8,
		'mem_size': 32768,
		'virtual_ip': '192.168.60.147',
		'disk_size_list': '【硬盘 1: 50.0GB】\n【硬盘 2: 200.0GB】\n',
		'os_version': 'CentOS 7 (64 位)'
	}, {
		'virtual_name': '192.168.60.145-k8s-node',
		'power_status': 1,
		'cpu_process': 8,
		'mem_size': 32768,
		'virtual_ip': '192.168.60.145',
		'disk_size_list': '【硬盘 1: 50.0GB】\n【硬盘 2: 200.0GB】\n',
		'os_version': 'CentOS 7 (64 位)'
	}, {
		'virtual_name': '192.168.60.146-k8s-node',
		'power_status': 1,
		'cpu_process': 8,
		'mem_size': 32768,
		'virtual_ip': '192.168.60.146',
		'disk_size_list': '【硬盘 1: 50.0GB】\n【硬盘 2: 200.0GB】\n',
		'os_version': 'CentOS 7 (64 位)'
	}]
}]

按此数据格式写入数据库的类

class MakeVsphereHostData(object):
    """处理vsphere数据库相关"""
    def __init__(self):
        pass

    def get_vsphere_login(self):
        """获取登录认证"""
        get_vsphere_login_data = VmwareLogin.objects.all()
        login_dict = {}
        for data in get_vsphere_login_data:
            login_dict["host"] = data.vsphere_host
            login_dict["port"] = data.vsphere_port
            login_dict["user"] = data.vsphere_user
            login_dict["pwd"] = data.vsphere_pwd
        return login_dict

    def insert_physics_config_mess(self, data):
        """插入数据到physics_config_mess表"""
        try:
            with transaction.atomic():
                insert_data = PhysicsConfigMess(
                    physics_id=data["physics_id"],
                    physics_ip=data["physical_host"],
                    manufacturer=data["manufacturer"],
                    production_model=data["production_model"],
                    sn=data["sn"],
                    cpu_sum=data["cpu_sum"],
                    cpu_kernel=data["cpu_kernel"],
                    cpu_process=data["cpu_process"],
                    cpu_model=data["cpu_model"],
                    cpu_utilization=data["cpu_utilization"],
                    mem_size=data["mem_size"],
                    mem_utilization=data["mem_utilization"],
                    disk_size=data["disk_size"],
                    disk_free_size=data["disk_free_size"],
                    os_version=data["os_version"],
                )
                insert_data.save()
            print("插入数据到physics_config_mess表完成")
            return True
        except Exception as err:
            print("插入数据到physics_config_mess表失败", err)
            return False

    def insert_virtual_machine_config(self, data, physics_id):
        """插入数据到virtual_machine_config表"""
        task_insert_list = []
        for commit_data in data:
            task_insert_list.append(VirtualMachineConfig(
                physics_id=physics_id,
                power_status=commit_data["power_status"],
                cpu_process=commit_data["cpu_process"],
                mem_size=commit_data["mem_size"],
                virtual_name=commit_data["virtual_name"],
                virtual_ip=commit_data["virtual_ip"],
                disk_size_list=commit_data["disk_size_list"],
                os_version=commit_data["os_version"]
            ))
        try:
            VirtualMachineConfig.objects.bulk_create(task_insert_list)
            print("插入数据到virtual_machine_config表完成")
            return True
        except Exception as err:
            print("插入数据到virtual_machine_config表失败:", err)
            return False


def from_vsphere_export_to_db():
    """从vsphere导出数据写入到数据库"""
    make_vsphere_data = MakeVsphereHostData()
    login_data = make_vsphere_data.get_vsphere_login()
    export_vsphere = export_vsphere_hosts.ExportVsphereData()
    v_data = export_vsphere.export_vsphere(login_data.get("host"),
                                           login_data.get("port"),
                                           login_data.get("user"),
                                           login_data.get("pwd")
                                           )
    for host_dict in v_data:
        uid = uuid.uuid1().hex
        host_dict["physics_id"] = uid
        make_vsphere_data.insert_physics_config_mess(host_dict)
        make_vsphere_data.insert_virtual_machine_config(host_dict.get("vm"), uid)
    return JsonResponse(v_data, safe=False)

物理机表数据

虚拟机表数据

 Python 获取EXSI宿主机上虚拟机数据_第1张图片

 

你可能感兴趣的:(Python基础,django,python,后端)