问题说明
快照是vcenter的一把双刃剑,既极大的方便了运维人员日常维护,但是快照忘了删除就比较坑。另
外备份软件都是依赖于做快照,经常会有快照没有成功清理的。
- 快照导致占用更多的磁盘,有些1t的虚拟机,一个快照可能有几百G。
- 快照导致后面服务器再做快照慢,容易造成备份的时候卡死。
记得vm的ops有快照清单的,但这么好的python场景,怎能不一试。 实现脚本功能如下
- 使用python脚本进行vcenter的api调用,抓取当前有快照的虚拟机
- 使用exhangelib发邮件。
- 用python发带表格的邮件。
- 甚至可以用python调用vcenter的api直接删除掉历史快照,但是就算了。快照删除最好还是一个个删除,同时删除很多服务器的快照,指不定会出问题。
#!/usr/bin/env python3
#coding=utf-8
#获取vcenter列表下开机的虚拟机存在快照的情况, 输出邮件
import atexit
from pyVmomi import vim,vmodl
from pyVim.connect import SmartConnectNoSSL, Disconnect
import re
from exchangelib import DELEGATE, Account, Credentials, Message, Mailbox, HTMLBody
#需要pip3 install exchangelib pyVmomi
#配置vcenter连接信息
host = "xxxxxx" #vcenterIP
user = "xxxxxx" #vcenter账号
pwd = "xxxxxx" #vcenter密码
port = 443
def Email(subject, body):
#前面是发件箱配置
creds = Credentials(
username='xxxxx', #邮箱账号
password='xxxxxx' #邮箱密码
)
account = Account(
primary_smtp_address='xxxxx@xxxx.com', #邮箱账号
credentials=creds,
autodiscover=True,
access_type=DELEGATE
)
m = Message(
account=account,
subject=subject,
body=HTMLBody(body),
#发送给谁,同时发送给多人是下面这样子,这个特别不好处理
to_recipients = [
Mailbox(email_address='xxxx@139.com'), #收件人1
Mailbox(email_address='xxxx@163.com'), #收件人2
#多人继续添加
]
#抄送
#cc_recipients = ['xxxx@xxxxx.com', 'xxxxxx@xxxxx.com'] #抄送人
)
m.send()
def vcenter_run_snapshot(host,user,pwd,port):
try:
#都说用NoSSL来,避免ssh出现问题
si = SmartConnectNoSSL(host=host, user=user, pwd=pwd, port=port)
atexit.register(Disconnect, si)
content = si.RetrieveContent()
obj = content.viewManager.CreateContainerView(content.rootFolder, [vim.VirtualMachine], True)
num = 1
message_tmp = []
for vm in obj.view:
#使用vm.summary可以看到,这里过滤一下,只输出开机的虚拟机。
if vm.summary.runtime.powerState == 'poweredOn':
if str(vm.snapshot).count("createTime") != 0:
#print(vm.snapshot)
#tmp = ('%s 虚拟机名:%s IP地址:%s 操作系统:%s 快照数量: %s 快照时间: %s' %(str(num),vm.summary.config.name,vm.summary.guest.ipAddress,vm.summary.config.guestFullName,
tmp = ('<tr align="center"><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td align="center">%s</td><td>%s</td></tr>' %(str(num),vm.summary.config.name,vm.summary.guest.ipAddress,vm.summary.config.guestFullName,
str(vm.snapshot).count("createTime"),str(re.findall(r"createTime = (.*),",str(vm.snapshot)))))
#print(tmp)
message_tmp.append(tmp)
num = num + 1
except vmodl.MethodFault as error:
print("Caught vmodl fault : " + error.msg)
return False, error.msg
return message_tmp
if __name__ == "__main__"
message = vcenter_run_snapshot(host,user,pwd,port)
message_head = "<h3>dear系统工程师:<h3><h3> 目前开机的服务器中有 %d 台虚拟机存在快照,请注意检查时间,本邮件来自xxxxxx上自动巡检脚本,无需回复。谢谢!</h3><br><br>" %len(message)
output = ""
for i in message:
output = output+str(i)+"<br>"
print(output)
# try:
# Email("xxxxxx的vcenter快照巡检",output)
# except Exception as e:
# print('Exception:', e)
try:
msg = """
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>使用html输出巡检结果</title>
</head>
<body>
<h1>
""" +message_head+"""
</h1>
<p id="first"></p>
<table border="1">
<th>序号</th>
<th>主机名</th>
<th>IP</th>
<th>操作系统版本</th>
<th>快照数量</th>
<th>快照时间</th>
"""+output+"""
</body>
</html>
"""
body = HTMLBody(msg)
Email("xxxxxx的vcenter快照巡检",body)
except Exception as e:
print('Exception:', e)