多服务器批量自动化配置脚本:从 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 和时间,可快速定位某台服务器某时间的操作记录。





