使用 Shell 脚本批量初始化 Linux 服务器适合同构集群环境,核心在于标准化安全策略、系统参数和基础工具。必须在执行前确保 SSH 连通性,脚本需具备权限检查、系统版本兼容性及回滚意识,严禁在生产环境无差别关闭防火墙。
先说结论:Shell 脚本能显著降低重复配置成本,但必须增强脚本健壮性并配合批量分发工具。
- 适合:同构服务器集群(如均为 CentOS 7+ 或 Ubuntu 20.04+)的批量部署
- 关键改进:脚本需包含 Root 权限检查、系统版本判断、chrony 替代 ntpdate、防火墙策略而非直接关闭
- 批量执行:结合 ssh 循环、pssh 或 ansible 实现多机并发执行
- 验收:逐台验证时间同步、安全策略生效情况及业务端口连通性
核心初始化脚本(增强版)
以下脚本增加了权限校验、系统版本识别及安全策略优化,避免盲目执行导致服务中断。
#!/bin/bash
set -e
# 1. 权限检查
if [ "$EUID" -ne 0 ]; then
echo "错误:请使用 root 权限运行此脚本"
exit 1
fi
# 2. 系统版本判断
if [ -f /etc/redhat-release ]; then
PM="yum"
SERVICE_MGR="systemctl"
elif [ -f /etc/debian_version ]; then
PM="apt"
SERVICE_MGR="systemctl"
else
echo "警告:未识别的操作系统版本,部分命令可能失效"
PM="unknown"
fi
# 3. 时间与时区同步 (推荐使用 chrony)
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "Asia/Shanghai" > /etc/timezone
if [ "$PM" == "yum" ]; then
yum install -y chrony
systemctl enable chronyd
systemctl start chronyd
elif [ "$PM" == "apt" ]; then
apt update
apt install -y chrony
systemctl enable chrony
systemctl start chrony
fi
# 4. 安全策略调整 (SELinux)
# 永久关闭需修改配置文件,仅 setenforce 重启后失效
if [ -f /etc/selinux/config ]; then
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
echo "SELinux 已配置为 Disabled (需重启永久生效)"
fi
# 5. 防火墙策略 (严禁生产环境直接关闭)
# 建议开放特定端口,此处仅示例开放 SSH 端口
if command -v firewall-cmd &> /dev/null; then
firewall-cmd `--permanent` `--add-service`=ssh
firewall-cmd `--reload`
echo "防火墙运行中,已开放 SSH 服务"
elif command -v ufw &> /dev/null; then
ufw allow ssh
ufw enable
echo "UFW 已启用并开放 SSH"
else
echo "未检测到常见防火墙工具,请手动确认安全组策略"
fi
# 6. 系统参数优化 (文件打开数)
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
# 7. 基础工具安装
if [ "$PM" == "yum" ]; then
yum install -y vim wget curl net-tools
elif [ "$PM" == "apt" ]; then
apt install -y vim wget curl net-tools
fi
echo "初始化完成,请重启系统使 SELinux 配置永久生效"批量执行方案
单机脚本验证无误后,可通过 SSH 循环或并行工具分发执行。以下是基于 SSH 密钥信任的简单批量执行示例。
前提:已配置管理机到所有目标主机的 SSH 免密登录。
#!/bin/bash
# hosts.txt 每行一个 IP 地址
HOSTS_FILE="hosts.txt"
SCRIPT_FILE="init.sh"
while read -r IP; do
echo "正在初始化:$IP"
# 上传脚本并执行
scp "$SCRIPT_FILE" "root@$IP:/tmp/"
ssh "root@$IP" "chmod +x /tmp/init.sh && /tmp/init.sh"
if [ $? -eq 0 ]; then
echo "$IP 初始化成功"
else
echo "$IP 初始化失败,请检查"
fi
done < "$HOSTS_FILE"对于大规模集群,建议使用 pssh 或 Ansible 以提高并发效率和错误处理能力。
验证方法
执行完成后,需逐台或通过批量命令验证关键配置是否生效。
- 时区检查:执行
date,确认显示 CST 时区且时间准确;检查systemctl status chronyd服务状态。 - SELinux 状态:执行
getenforce返回 Disabled;检查/etc/selinux/config配置项是否为 disabled。 - 文件限制:执行
ulimit -n,确认输出为 65535;注意新登录会话才生效。 - 防火墙状态:执行
firewall-cmd `--list-services`或ufw status,确认 SSH 端口开放且服务运行中。 - 工具验证:执行
vim `--version`、curl `--version`确认基础工具已安装。
常见坑与排查
- SSH 锁死风险:修改 SSH 配置(如禁止 root 登录、修改端口)前,务必确认密钥登录可用且新端口在防火墙放行,否则可能导致无法远程连接。
- SELinux 生效机制:修改
/etc/selinux/config后通常需重启系统才能永久生效,仅执行setenforce 0重启后会还原。 - 网络中断风险:批量执行防火墙规则时,若规则错误可能导致当前 SSH 会话断开。建议先放行 SSH 端口,再调整其他策略。
- 内核参数加载:若修改了
sysctl.conf,需执行sysctl -p立即生效,否则需重启。 - 包管理器冲突:脚本中需严格区分 yum/apt,避免在不支持的系统上调用错误命令导致脚本中断(已使用
set -e防止错误扩散)。
建议参考各发行版官方文档进行参数调优,生产环境操作前务必在测试环境验证。