# -*- coding:utf-8 -*-
import os
import atexit
import datetime
from pyVmomi import vim, vmodl
from pyVim.connect import SmartConnectNoSSL, Disconnect
from configparser import ConfigParser
import datetime
import xlwt
def setStyle(name):
style = xlwt.XFStyle()
font = xlwt.Font()
pattern = xlwt.Pattern()
alignment = xlwt.Alignment()
font.colour_index = 1 # 字体颜色
font.name = name # 字体
font.bold = True # 加粗
alignment.horz = 2 # 对齐方式,居中
pattern.pattern = xlwt.Pattern.SOLID_PATTERN
pattern.pattern_fore_colour = 23 # 背景颜色
style.alignment = alignment
style.pattern = pattern
style.font = font
return style
def data_write(filepath, datas):
f = xlwt.Workbook()
sheet1 = f.add_sheet(u'虚拟机清单', cell_overwrite_ok=True)
line_01 = ['数据中心', 'Vcenter', '集群', '主机', '名称', 'IP地址', '状况', '客户机操作系统', '内存大小', 'Cpu计数',
'置备空间', '已用空间', '所在路径', '备注', 'IPS']
for x in range(len(line_01)):
sheet1.write(0, x, line_01[x], setStyle("宋体"))
i = 1 # i 值为excel从第几行开始写
for data in datas:
for j in range(len(data)):
sheet1.write(i, j, data[j])
i = i + 1
f.save(filepath)
def getNics(guest):
ips = []
for nic in guest.net:
if nic.ipConfig is not None and nic.ipConfig.ipAddress is not None:
ipconf = nic.ipConfig.ipAddress
for ip in ipconf:
ips.append(ip.ipAddress)
if len(ips) == 0:
return []
else:
return ips
def getStorage(storage):
storage_userd = round((storage.committed / 1024 ** 3), 2)
storage_left = round((storage.uncommitted / 1024 ** 3), 2)
storage_total = int(storage_left) + int(storage_userd)
return storage_userd, storage_total
def vmsummary(dc, vc_ip, cluster, summary, guest):
vm_list = []
storage_userd, storage_total = getStorage(summary.storage)
ips = getNics(guest)
vm_list.append(dc)
vm_list.append(vc_ip)
vm_list.append(cluster)
vm_list.append(summary.runtime.host.name)
vm_list.append(summary.config.name)
vm_list.append(summary.guest.ipAddress)
vm_list.append(summary.runtime.powerState)
vm_list.append(summary.guest.guestFullName)
vm_list.append(summary.config.memorySizeMB)
vm_list.append(summary.config.numCpu)
vm_list.append(storage_total)
vm_list.append(storage_userd)
vm_list.append(summary.config.vmPathName)
vm_list.append(summary.config.annotation)
vm_list.extend(ips)
return vm_list
def run(si, vc_address, config:dict):
global vm_lists
try:
time_start = si.CurrentTime()
content = si.RetrieveContent()
#dc_name = cfg["info"]
children = content.rootFolder.childEntity
for child in children:
dc = child
dc_name = child.name
clusters = dc.hostFolder.childEntity
for cluster in clusters:
hosts = cluster.host
for host in hosts:
vms = host.vm
for vm in vms:
vm_list = vmsummary(dc_name, vc_address, cluster.name, vm.summary, vm.guest)
vm_lists.append(vm_list)
time_end = si.CurrentTime()
#print("结束时间:", time_end.strftime("%Y-%m-%d:%H:%M"))
time_spend = time_end - time_start
print("耗时:", time_spend)
except vmodl.MethodFault as error:
print("Caught vmodl fault:" + error.msg)
return False, error.msg
else:
atexit.register(Disconnect, si)
return True, "Ok"
if __name__ == "__main__":
try:
base_dir = os.path.dirname(os.path.abspath(__file__))
html_dir = "/var/www/html/prod/"
virtual_file = os.path.join(html_dir, os.path.join("VMS", "%s.xlsx" % (datetime.datetime.now().strftime("%Y-%m-%d"))))
config_file = os.path.join(base_dir, os.path.join("etc", "vSphere.ini"))
config = ConfigParser()
config.read(config_file, encoding="utf-8")
vm_lists = []
for section in config.sections():
cfg = dict(config.items(section))
try:
si = SmartConnectNoSSL(host=section, port=cfg["port"], user=cfg["user"], pwd=cfg["passwd"])
except Exception as e:
print("Login Error:" + cfg["info"])
continue
else:
print("Login Success:" + cfg["info"])
run(si, section, cfg)
data_write(virtual_file, vm_lists)
print("虚拟机数量:", len(vm_lists))
except Exception as err:
print(err)
finally:
exit()
[10.250.x.x]
info = Transsion-TEST
user = administrator@vsphere.local
passwd = x
port = 443
[10.250.x.x]
info = Transsion-Pre-Prod
user = administrator@vsphere.local
passwd = x
port = 443
| 数据中心 |
Vcenter |
集群 |
主机 |
名称 |
IP地址 |
状况 |
客户机操作系统 |
内存大小 |
Cpu计数 |
置备空间 |
已用空间 |
所在路径 |
备注 |
IPS |
| Transsion-Pre-Prod-DC |
10.250.x.x |
10.250.x.x |
10.250.x.x |
Nac-3-14(101.201) |
10.250.101.201 |
poweredOn |
Linux (64-bit) |
65536 |
48 |
607 |
552.02 |
[100.18_local_data] Nac-3-14(101.201)/Nac-3-14(101.201).vmx |
系统:未知, 主机名:Nac-3-14(101.201), IP地址:10.250.101.201, 负责人:xx, 创建时间:2021-01-05 |
10.250.101.201 |