以下从 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)
物理机表数据
虚拟机表数据