First Commit
This commit is contained in:
14
.env
Normal file
14
.env
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# vCenter配置(支持多个)
|
||||||
|
VCENTER_HOSTS=192.168.40.134
|
||||||
|
VCENTER_USER=administrator@lan.com
|
||||||
|
VCENTER_PASSWORD=Root@2025
|
||||||
|
# 快照保留天数
|
||||||
|
SNAPSHOT_RETENTION_DAYS=15
|
||||||
|
# 每台vCenter同时删除的快照数量限制
|
||||||
|
MAX_DELETE_CONCURRENT=4
|
||||||
|
# Excel导出路径
|
||||||
|
# EXCEL_OUTPUT_PATH=/tmp/vm_snapshots_report.xlsx
|
||||||
|
EXCEL_OUTPUT_PATH=./vm_snapshots_report.xlsx
|
||||||
|
# 日志文件路径
|
||||||
|
# LOG_FILE_PATH=/var/log/vm_snapshot_cleanup.log
|
||||||
|
LOG_FILE_PATH=./log/vm_snapshot_cleanup.log
|
||||||
7
README.md
Normal file
7
README.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# 以下需求需要每个月执行一次,使用ansible实现,还是使用python代码实行好?
|
||||||
|
-[x] 获取所有vms
|
||||||
|
-[ ] 获取所有snapshots
|
||||||
|
-[ ] 筛选出15天(半个月)前的snapshots
|
||||||
|
-[ ] 以上内容以Excel表格的形式导出
|
||||||
|
-[ ] 最后删除15天前的snapshot,并同时记录删除的snapshot日志信息
|
||||||
|
-[ ] 需要控制每台vCenter不可以同时删除超过4个快照
|
||||||
33
config/settings.py
Normal file
33
config/settings.py
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
import os
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
# 加载.env文件
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
# ========== 基础配置 ==========
|
||||||
|
# vCenter配置
|
||||||
|
VCENTER_HOSTS = os.getenv('VCENTER_HOSTS', '').split(',')
|
||||||
|
VCENTER_USER = os.getenv('VCENTER_USER', '')
|
||||||
|
VCENTER_PASSWORD = os.getenv('VCENTER_PASSWORD', '')
|
||||||
|
|
||||||
|
# 快照策略配置
|
||||||
|
SNAPSHOT_RETENTION_DAYS = int(os.getenv('SNAPSHOT_RETENTION_DAYS', 15))
|
||||||
|
MAX_DELETE_CONCURRENT = int(os.getenv('MAX_DELETE_CONCURRENT', 4))
|
||||||
|
|
||||||
|
# 输出路径配置
|
||||||
|
EXCEL_OUTPUT_PATH = os.getenv('EXCEL_OUTPUT_PATH', '/tmp/vm_snapshots_report.xlsx')
|
||||||
|
LOG_FILE_PATH = os.getenv('LOG_FILE_PATH', '/var/log/vm_snapshot_cleanup.log')
|
||||||
|
|
||||||
|
# 计算快照过期时间(全局变量)
|
||||||
|
EXPIRE_DATE = datetime.now() - timedelta(days=SNAPSHOT_RETENTION_DAYS)
|
||||||
|
|
||||||
|
# 验证必要配置
|
||||||
|
def validate_config():
|
||||||
|
"""验证配置是否完整"""
|
||||||
|
required = [
|
||||||
|
VCENTER_HOSTS, VCENTER_USER, VCENTER_PASSWORD,
|
||||||
|
SNAPSHOT_RETENTION_DAYS, MAX_DELETE_CONCURRENT
|
||||||
|
]
|
||||||
|
if not all(required) or '' in VCENTER_HOSTS:
|
||||||
|
raise ValueError("配置不完整,请检查.env文件中的vCenter信息和策略配置")
|
||||||
20
main.py
Normal file
20
main.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# 这是一个示例 Python 脚本。
|
||||||
|
|
||||||
|
# 按 Shift+F10 执行或将其替换为您的代码。
|
||||||
|
# 按 双击 Shift 在所有地方搜索类、文件、工具窗口、操作和设置。
|
||||||
|
|
||||||
|
|
||||||
|
def print_hi(name):
|
||||||
|
# 在下面的代码行中使用断点来调试脚本。
|
||||||
|
print(f'Hi, {name}') # 按 Ctrl+F8 切换断点。
|
||||||
|
|
||||||
|
|
||||||
|
# 按装订区域中的绿色按钮以运行脚本。
|
||||||
|
if __name__ == '__main__':
|
||||||
|
print_hi('PyCharm')
|
||||||
|
|
||||||
|
# 访问 https://www.jetbrains.com/help/pycharm/ 获取 PyCharm 帮助
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
40
vcenter_connector.py
Normal file
40
vcenter_connector.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
from pyVim.connect import SmartConnect, Disconnect
|
||||||
|
from pyVmomi import vim
|
||||||
|
from config.settings import VCENTER_USER, VCENTER_PASSWORD
|
||||||
|
from utils.logger import logger
|
||||||
|
|
||||||
|
|
||||||
|
def connect_to_vcenter(vcenter_host):
|
||||||
|
"""
|
||||||
|
连接到指定的vCenter服务器
|
||||||
|
:param vcenter_host: vCenter主机名/IP
|
||||||
|
:return: 成功返回ServiceInstance,失败返回None
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
# 禁用SSL证书验证(生产环境建议启用证书验证)
|
||||||
|
si = SmartConnect(
|
||||||
|
host=vcenter_host,
|
||||||
|
user=VCENTER_USER,
|
||||||
|
pwd=VCENTER_PASSWORD,
|
||||||
|
disableSslCertValidation=True
|
||||||
|
)
|
||||||
|
if not si:
|
||||||
|
logger.error(f"❌ 无法连接到vCenter: {vcenter_host}(无返回实例)")
|
||||||
|
return None
|
||||||
|
|
||||||
|
logger.info(f"✅ 成功连接到vCenter: {vcenter_host}")
|
||||||
|
return si
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ 连接vCenter {vcenter_host} 失败: {str(e)}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def disconnect_from_vcenter(si):
|
||||||
|
"""
|
||||||
|
关闭vCenter连接
|
||||||
|
:param si: ServiceInstance实例
|
||||||
|
"""
|
||||||
|
if si:
|
||||||
|
Disconnect(si)
|
||||||
|
logger.debug("已关闭vCenter连接")
|
||||||
Reference in New Issue
Block a user