Lenovo XClarity Integrator for Proxmox
Lenovo XClarity Integrator for Proxmox 是一个基于 Python 的工具,可以为运行在 Lenovo ThinkSystem 服务器上的 Proxmox 集群环境自动更新固件。 它与 Lenovo XClarity Administrator (LXCA) 集成,确保您的基础设施始终保持最新硬件更新,最大限度减少停机时间,降低人工干预。
本方案适用于希望简化 Proxmox 集群更新管理的 IT 管理员。
功能特色
- 与 Lenovo XClarity Administrator REST API 无缝集成
- 根据 Lenovo XClarity Administrator 应用的策略自动更新固件
- 支持集群感知的更新操作,减少服务中断
- 更新结果日志记录与报告
- 可通过
config.ini文件自定义配置
工作原理
当您运行该程序时,会执行以下步骤:
- 从
config.ini文件加载运行参数 - 如果密码以安全方式(加密)存储,则会要求输入主密码
- 验证主机是否由 LXCA 管理,并已关联固件合规策略
- 检查主机是否符合分配的合规策略
- 如果不符合,依次迁移主机上的虚拟机和 CT,LXCA 执行固件更新,更新后再将虚拟机迁回主机
需求
- Python:3.x(已在 Python 3.11 和 Python 3.13(严格 SSL)测试)
requirements.txt中列出的 Python 库- 已运行的 Lenovo XClarity Administrator 实例,并有相应的 API 凭据
- 运行在 Lenovo XClarity Administrator 支持服务器上的 Proxmox VE 集群 或 Proxmox VE 单节点(仅在 Lenovo ThinkSystem 服务器上测试)
- 集群中每台服务器都分配了 合规策略
- 用于运行此工具的操作系统实例(推荐 Linux,但 Windows 也可用)。注意:不支持/不建议直接在 Proxmox 服务器上运行。
安装步骤
-
在您的系统上解压安装包(建议基于 Linux)
-
(可选但推荐)设置 Python 虚拟环境 2.1. 在项目目录下创建新的虚拟环境:
python -m venv venv2.2. 激活虚拟环境:
- Linux/Mac 下:
source venv/bin/activate- Windows 下:
venv\Scripts\activate -
安装依赖库:
pip install -r requirements.txt -
准备您的配置文件(见下方 配置文件 部分)。
配置文件
-
查看示例配置文件
config.ini.sample。 该文件包含所有可配置参数,包括:- LXCA 主机名或 IP
- LXCA API 凭据
- Proxmox 集群节点列表
-
复制示例文件并自定义:
cp config.ini.sample config.ini
使用您喜欢的编辑器编辑 config.ini,声明特定环境的设置。
字段说明
Proxmox 部分
-
PROXMOX_USER - 必填 - 此字段填写有权访问 Proxmox 集群(集群内每个节点)并执行如迁移虚拟机等操作的用户名。必须是 Linux 用户,因为还需要设置节点维护模式。默认值为 root@pam(不带引号)。
-
PROXMOX_PASS - 必填 - 需在此处存储
PROXMOX_USER字段声明用户的密码。密码可明文存储(最简单但安全性低),也可加密存储(更安全)。关于如何在配置文件中加密存储密码,请参见下方“安全性”部分。 -
PROXMOX_VERIFY_SSL - 必填 - 如果想跳过 SSL 证书验证,可将此字段设为
False。通常自签名证书时会这样设置,如果您使用自签名证书且 Python > 3.11,必须将此参数设为False。如需设为True,请参见“CA 证书验证”部分说明。 -
CLUSTER_NODES - 必填 - 此字段包含可由工具更新的主机。该字段为数组,每个元素为 JSON 格式对象,描述主机的三个参数: -- xcc = 主机 XCC 的 IP 地址(必须为 IP 地址,不能是主机名) -- pve_ip = PVE 主机的 IP 地址 -- pve_host = PVE 主机名
主机的预期格式为:
{"xcc":<IP_xcc_node>, "pve_ip": <IP_node> , "pve_host": <NAME_node>}
-
TIMEOUT_HOST - 可选 - 指定升级过程最大等待时间(秒)。默认值为 3600
-
TIMEOUT_VM - 可选 - 指定虚拟机操作(迁移、关机)最大等待时间(秒),超时则返回错误。默认值为 300 秒
-
VM_LOCAL_DISKS - 必填 - 允许值为:
POWEROFF,授权工具关机带有本地磁盘(如 cdrom、本地存储虚拟机磁盘)的虚拟机;FAIL,则停止流程并允许手动处理。默认值为FAIL -
VM_LOCAL_RESOURCES - 必填 - 允许值为:
POWEROFF,授权工具关机带有本地资源(如 PCIe 适配器)的虚拟机;FAIL,则停止流程并允许手动处理。默认值为FAIL -
VM_LOCAL_DISKS_EXPERT - 实验性 - 可选 - 风险自负!!仅限专家使用 - 除非您非常清楚,否则不要使用。此参数允许迁移带有本地磁盘(非 cdrom)的虚拟机。您需自行确保运行时所有要求都满足(如存储名称一致、磁盘空间充足等)。允许值为:
True,程序会尝试迁移带本地磁盘(非本地 cd-rom)的虚拟机,或False,程序会遵循VM_LOCAL_DISKS的设置。默认值为False
LXCA 会话
-
LXCA_HOST - 必填 - 此字段填写管理 Proxmox 服务器的 Lenovo XClarity Administrator (LXCA) 实例的 IP 地址(或 DNS 可解析的主机名)。
-
LXCA_USER - 必填 - 此字段填写有权对 Proxmox 管理服务器进行更新的 LXCA 管理用户名。
-
LXCA_PASS - 必填 - 在此处填写
LXCA_USER字段指定用户的密码。密码可明文存储(最简单但安全性低),也可加密存储(更安全)。关于如何在配置文件中加密存储密码,请参见下方“安全性”部分。 -
LXCA_VERIFY_SSL - 必填 - 如果想跳过 SSL 证书验证,可将此字段设为
False。通常自签名证书时会这样设置,如果您使用自签名证书且 Python > 3.11,必须将此参数设为False。如需设为True,请参见“CA 证书验证”部分说明。
安全性部分
- SALT - 可选 - 可在此处存储 SALT,以支持加密密码存储。
请注意:如果您担心在 config.ini 文件中存储明文密码,可以通过以下方法加密存储。如果在配置文件中声明了 SALT 选项,程序会要求输入主密码以解密配置中的密码字段。
如何在 config.ini 中加密密码(可选)
如果您希望在配置文件中加密存储密码,可以运行 create_encrypted_password.py 程序。
python create_encrypted_password.py
程序会要求输入主密码(后续运行 integrator 时需要),并加密 PVE 和 LXCA 密码,输出需放入配置文件的内容(示例):
Add the following three lines to your config.ini:
LXCA_PASS = gAAAAABonuj0JNenRko_DS-HTcZkFfoho_ZID6RcwLTFPNn7A2QYsNgtE3-wjzCE8R0_bpVquZLDGpe9ARpJdZ7tSEWoNXTOQg==
PROXMOX_PASS = gAAAAABonuj0aXh5IYUhClWjBaOBh9HgcvtmwyB9rYzlvnSO-NAS51rNQXaBH0CjlgvF4lkwpPsXSIi2SLpozKmueTtpV_uQJQ==
SALT = E3T1B/Ty6nk3RJq7dQq8Pg==
CA 证书验证
如果您的环境使用自定义证书,可以选择验证 Proxmox 主机和/或 LXCA 实例的证书,以满足安全合规要求。
为此,需在工具目录下创建名为 custom_cacert.pem 的文件,并手动存储环境的 CA 证书(pem 格式,见下方示例):
-----BEGIN CERTIFICATE-----
MIIFzTCCA7WgAwIBAgIUdmBnkIBixu29Fv7wAI4de2sxPQ0wDQYJKoZIhvcNAQEL
BQAwdjEkMCIGA1UEAwwbUHJveG1veCBWaXJ0dWFsIEVudmlyb25tZW50MS0wKwYD
VQQLDCQzNzI4MzdlNS1jMjvkLTQwZjgtODA2NC02YWY2OTFlNWMxODMxHzAdBgNV
BAoMFlBWRSBDbHVzdGVyIE1hbmFnZXIgQ0EwHhcNMjUwMzE0MTE0NDE5WhcNMzUw
MzEyMTE0NDE5WjB2MSQwIgYDVQQDDbtQcm94bW94IFZpcnR1YWwgRW52aXJvbm1l
bnQxLTArBgNVBAsMJDM3MjgzN2U1LWMyNWQtNDBmOC04MDY0LTZhZjY5MWU1YzE4
MzEfMB0GA1UECgwWUFZFIENsdXN0ZXIgTWFuYWdlciBDQTCCAiIwDQYJKoZIhvcN
aQEBBQADggIPADCCAgoCggIBANR+cPxIkIEBNx9YCAaaL2+fOUWy/fBaeBMCdD+D
7F/Bi+Mcpn2p3+gVuhyCaTcYZnP0aewHUI4xCL8YHFwqWv6J7ryMV++i/0Rbkzny
EZvKISNxTuZ/9ZioP1S9K3Se3ZVZI23xyLQ/Wu2mqPo5d3QLttR5/ndBLVmUtMZe
pz3Jlj2kQxvQrbG4SdHBs4GpqLbDoqktkFK+nJjGuibNVovZFKufv+7ySoKhbF9l
I21A4Ta+QqlhG+TD6r4c61yGKgX/IozrsvIOaOBwLHX81gEOwh5BZ6G++OKblQu+
nb7ZEyZYUQ4sT6I+HykcyA9amil4Six5qnOohNJwtd9QCZZiFWQhOS+cI627L0EU
uQ7DJ60McDyrMqgNWZOnBKLqoDSi2M1ZkXI1ACa/IoUeutITlMnZucLIdTM1VPhV
qQIJDqb2TaKQnjxnuqSXaA0DVwcSnX+VZgTUbzbV/+tlPENnQ3KcarqwvkUXlQB0
uagYmCURylUJXOT4r+8oUJDak4zwPjOQLH+PF3OdGScj4FIByNL+1G08UmhHzixi
a76J8eF0NOx65tBJDjie3McU7vrDJ8DrIbcM/LOvFa9PCrGe9wNmHqqOtoUuxdaR
b6co1YE34OF2cdyeaEVRVYtKFFp/Oa0ZA10eBEOFxzv4KTFi4/Y+nuMjKMYY0Kmo
XUxJAgMBAAGjUzBRMB0GA1UdDgQWBBQxTKcz/j1/m505HaGyrZtGqiDaFDAfBgNV
HSMEGDAWgBQxTKcz/j1/m505HaGyrZtGqiDaFDAPBgNVHRMBAf8EBTADAQH/MA0G
CSqGSIb3DQEBCwUAA4ICAQCcsA4imt0cpgYNbBvufvBpObGKkiSoimd6p1fpJhjX
PMDdtn6dVw2zbAmqDmBqdRTenK9J30OWVoYmpnh5H+p8wM1uT5js248DmhtXTeUd
xHHVyz9c2ooZT/7EGqWAa/VRpKAeN99uzEmLZzxxb0Sg7wvN8Q7KbIiJdtckqo09
sZqDXIKFnqRL0Gyys9ZvsGZFpZoUipA+IbJVQlArKjWFNZkPhT14xMPdoZAMX4Zi
45srzk4Z9sJjKkYaA5eFsirbPOi9N5KmrqmD2c1Jb4p3ScdzJO7ay5PmkYdeIq3K
vN9MPAuMSDWmQasqB/oO1gRmdcWNU2ABbsrEeALMPhe/J82meUQd7MorVC87OUJ6
mp2b97TTBDqsqsqrygKmWb2YFXFS/uR5ZaYEXDjxe9LXCRODRJAlGF882PS20YoV
iUBGWd361+nkLkJ3GaT8l/PkpHLg5mXU6UmiPEw9O+mzYFNAhYzvzfIP4G4afYYo
T+/8KBbqWVuW6ecv/vqLQIyc0ucOgnH9vhwliGTyMug/GhaTjXFtRdjdu0W7irmM
CgkLeEpvWN1xgNTBILIqva6dc31V36hOVgSjRcIr4r0sCe2I3J6ixw7ShHXxMYAi
od9Lz4mJrL4k1SovZEonEr6HmXYlsdV2R6/ZaoCKYN2F1zZ4IzGuSRU1iUiz5iCN
WQ==
-----END CERTIFICATE-----
请注意:自 Python 3.13 起,SSL 管理实现了更严格的默认设置。这使底层 OpenSSL 实现更符合 RFC 5280 标准,但与旧版 X.509 证书存在一定不兼容。SSL 上下文现在默认使用 VERIFY_X509_PARTIAL_CHAIN 和 VERIFY_X509_STRICT 验证标志。这意味着 CA 证书必须符合所有严格规则(如 X509v3 Key Usage、X509v3 Basic Constraints = Critical 等)。
使用方法
python lxca_proxmox_integrator.py
不带参数运行时,会显示如下使用帮助:
usage: lxca_proxmox_integrator.py [-h] (-d | -x) [-v] [-c] [-V]
LXCA Proxmox integrator command line parameters
options:
-h, --help show this help message and exit
-d, --dry-run Simulate the upgrade
-x, --execute Perform the upgrade
-v, --verbose Add verbosity to the ouput
-c, --clearlog Move current log to backup and start a clean log file
-V, --version Show program version
您必须指定 -d | --dry-run 或 -x | --execute 参数。
dry-run 参数(-d | --dry-run)允许您模拟完整流程,但不会对集群执行任何操作。
dry-run 期间会进行模拟,列出环境中的所有发现(建议与 -v 选项一起使用)。
强烈建议在使用 -x | --execute 参数运行前,务必先执行 dry-run(-d | --dry-run),因为后者会实际运行固件更新。
-v | --verbose 参数可增加输出详细度(控制台和日志均适用)。
-c | --clearlog 参数会备份当前日志,并初始化一个新的空日志文件。
工具主要流程如下:
- 如有需要,要求输入主密码(可选)
- 连接到您的 LXCA 实例
- 检查 ThinkSystem 节点是否有可用更新
- 协调集群/节点的固件更新
请注意:目前不支持 CT 容器的在线迁移,因此迁移时会先关闭容器,然后立即在目标主机上重启。
日志记录
所有操作都会记录到控制台和日志文件(lxca_proxmox_integrator.log)。请查阅日志以确认更新成功或排查问题。
免责声明
-
最佳实践建议:在集群范围内推送固件和驱动更新前,务必先在测试或非生产环境中进行验证。您也可以利用 DRY_RUN 执行模拟其他操作,但不会实际应用固件更新。
-
流程中遇到任何错误,工具会停止运行,便于 IT 管理员检查并修复问题。唯一例外是虚拟机/CT 的“开机”操作,相关信息会记录在日志中,但流程会继续。恢复正确状态可能需要手动干预。
-
除非适用法律要求或书面同意,依据许可证分发的软件均按“原样”提供,不附带任何明示或暗示的担保。具体权限和限制请参见许可证条款。
许可证
根据 Apache License, Version 2.0(“许可证”)授权:http://www.apache.org/licenses/LICENSE-2.0