多服务器批量自动化配置脚本
多服务器批量自动化配置脚本:从 0 到 1 实现 Linux 运维效率提升
在日常 Linux 运维工作中,你是否遇到过这些痛点?新上线 10 台服务器,需要逐台登录关闭防火墙、创建用户、安装工具;重复操作耗时且容易出错;操作记录分散,出问题后难以追溯。今天,我们将通过一份基于 Python 的多服务器批量自动化配置脚本,彻底解决这些问题,让运维工作效率提升 10 倍。
一、脚本核心功能与适用场景
在深入代码前,先明确脚本的定位:这是一款针对 Linux 服务器(以 openEuler 为例)的初始化配置自动化工具,支持多服务器并发处理,核心功能包括:
- 批量 SSH 连接目标服务器(无需手动输入密码)
- 统一执行基础配置:永久关闭防火墙
- 标准化用户管理:创建管理员用户(带 sudo 权限)和普通用户
- 批量安装运维高频工具(26 个,覆盖文件传输、网络监控、文本处理等场景)
- 详细日志记录:每台服务器操作日志独立保存,支持问题追溯
适用场景:
- 新服务器集群初始化(10 台 + 效率优势明显)
- 跨部门服务器标准化配置(避免 “各台服务器环境不一致” 问题)
- 运维操作自动化(减少人工干预,降低操作风险)
二、脚本依赖与环境准备
在使用脚本前,需完成以下准备工作,确保环境兼容性:
1. 依赖库安装
脚本基于paramiko实现 SSH 连接,需先安装该库:
bash
# 安装paramiko(支持Python 3.6+)
pip install paramiko
2. 目标服务器要求
- 操作系统:openEuler/CentOS/RHEL(基于 dnf/yum 包管理器,其他发行版需修改包管理命令)
- SSH 服务:已开启(默认 22 端口,可在脚本中修改端口)
- 登录权限:拥有 root 账号及密码(脚本初始用 root 登录,后续可切换到管理员用户)
- 网络连通性:执行脚本的机器能 ping 通目标服务器,且 22 端口未被防火墙拦截
三、脚本核心模块解析(从配置到执行)
脚本采用模块化设计,每个模块职责清晰,便于维护和扩展。我们按 “配置→连接→任务→并发” 的流程,逐一拆解核心模块。
模块 1:基础配置(可直接修改的参数中心)
这部分是脚本的 “控制面板”,所有可定制化的参数都集中在这里,无需修改后续代码即可适配不同场景:
python
# -------------------------- 基础配置 --------------------------
# 1. SSH连接信息(必填)
SSH_USER = "root" # 登录用户名(默认root)
SSH_PASS = "Admin@2025" # 登录密码(需替换为实际密码)
BASE_IP = "88.88.88." # IP前缀(如目标IP是192.168.1.2-10,这里填"192.168.1.")
IP_RANGE = range(2, 5) # IP后缀范围(生成88.88.88.2-4,左闭右开)
MAX_CONCURRENT = 10 # 最大并发数(根据服务器性能和网络调整,建议10-20)
# 2. 待安装工具包(按类别分组,可增删)
TOOL_PACKAGES = {
"文件与传输": ["wget", "curl", "lrzsz", "unzip", "p7zip", "tar"],
"网络工具": ["net-tools", "tcpdump", "traceroute", "mtr", "nmap", "bind-utils", "telnet", "nc"],
"文本编辑与处理": ["vim-enhanced", "grep", "sed", "gawk", "diffutils", "patch", "dos2unix"],
"系统监控与调试": ["htop", "iotop", "sysstat", "strace", "ltrace"]
}
# 扁平化工具包列表(用于批量安装)
ALL_PACKAGES = [pkg for category in TOOL_PACKAGES.values() for pkg in category]
配置修改建议:
- 首次使用时,优先修改
SSH_USER、SSH_PASS、BASE_IP和IP_RANGE,确保能连接到目标服务器; - 工具包可根据需求增删,例如需要 Docker 可添加
"docker-ce"(需提前配置 Docker 仓库); - 并发数
MAX_CONCURRENT:若目标服务器数量少(<10),可设为 5-10;若数量多(>50),建议设为 15-20,避免网络拥堵。
模块 2:日志系统(操作可追溯的关键)
运维脚本的核心需求之一是 “可追溯”—— 出问题时能快速定位原因。脚本通过setup_logging函数实现了按服务器 IP + 时间戳生成独立日志文件,同时在控制台实时输出进度:
python
def setup_logging(script_dir, ip):
# 1. 创建日志目录(与脚本同层级的execution_logs文件夹)
log_dir = os.path.join(script_dir, "execution_logs")
os.makedirs(log_dir, exist_ok=True) # 目录不存在则创建,存在则跳过
# 2. 日志文件名格式:IP_年月日_时分秒.log(如88.88.88.2_20240520_143025.log)
log_filename = f"{ip}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log"
log_path = os.path.join(log_dir, log_filename)
# 3. 配置日志器(避免多线程日志混乱)
logger = logging.getLogger(f"server_{ip}") # 为每个服务器创建独立日志器
logger.setLevel(logging.INFO)
logger.propagate = False # 禁止日志向上传递(避免重复输出)
# 4. 配置文件日志(详细格式:时间戳+日志级别+内容)
file_handler = logging.FileHandler(log_path, encoding="utf-8")
file_handler.setFormatter(logging.Formatter("[%(asctime)s] [%(levelname)s] %(message)s"))
# 5. 配置控制台日志(简洁格式:仅内容)
console_handler = logging.StreamHandler()
console_handler.setFormatter(logging.Formatter("%(message)s"))
# 6. 添加处理器
logger.addHandler(file_handler)
logger.addHandler(console_handler)
return logger, log_dir
日志优势:
- 独立性:每台服务器的日志单独保存,不会相互干扰;
- 完整性:记录所有操作(连接、命令执行、结果),包括成功和失败信息;
- 易查找:文件名包含 IP 和时间,可快速定位某台服务器某时间的操作记录。











