如何编写系统初始化配置脚本

wen 实用脚本 2

自动化部署的基石

目录导读

  • 什么是系统初始化配置脚本?

    如何编写系统初始化配置脚本

  • 为什么需要编写初始化脚本?(5大核心价值)

  • 编写脚本前的准备工作(环境与工具)

  • 四步编写高质量初始化脚本(实战步骤)

  • 常见问答(Q&A)

  • 最佳实践与避坑指南


什么是系统初始化配置脚本?

系统初始化配置脚本是一段自动化代码,通常以Shell、PowerShell、Ansible Playbook或Python脚本形式存在,用于在新安装的操作系统(如Linux/Windows服务器)首次启动后,完成一系列标准化配置任务,它解决了“每次手动配系统”的低效与出错风险。

核心目标:从“裸机”到“可用服务环境”一键完成。


为什么需要编写初始化脚本?(5大核心价值)

价值点 说明
速度 手动配置需30分钟,脚本只需30秒
一致性 避免“张三配的系统和李四不一样”的混乱
可审计 脚本即文档,每次变更可追溯
可重复 100台机器同配置,一次编写多次运行
减少人为错误 密码漏设、端口忘开等低级失误归零

编写脚本前的准备工作

环境确认

  • 目标OS:Ubuntu 20.04? CentOS 7? Windows Server 2022?
  • 权限要求:是否需root/管理员权限?
  • 网络状况:是否可访问外部包管理器?

工具选择

场景 推荐工具
单台Linux快速配置 Bash脚本
多台Linux批量部署 Ansible / Terraform
云环境自动化 User Data(AWS)/自定义镜像
Windows系统 PowerShell DSC

梳理配置清单(示例)

✅ 更新系统包
✅ 创建普通用户并配置sudo
✅ 配置SSH密钥登录(禁止密码)
✅ 设置时区为Asia/Shanghai
✅ 修改主机名
✅ 安装核心工具(vim, git, curl, htop)
✅ 配置防火墙(仅开22,80,443端口)
✅ 安装Docker并启动
✅ 修改内核参数(如net.core.somaxconn)
✅ 写入环境变量

四步编写高质量初始化脚本

编写脚本主体(以Bash为例)

#!/bin/bash
set -e  # 出错即停止,避免“半成功”状态
# 变量定义
NEW_USER="deployer"
SSH_PORT="2222"
TIMEZONE="Asia/Shanghai"
# 更新系统
apt update && apt upgrade -y
# 创建用户
useradd -m -s /bin/bash $NEW_USER
echo "$NEW_USER ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# 配置SSH
sed -i "s/#Port 22/Port $SSH_PORT/" /etc/ssh/sshd_config
sed -i "s/PermitRootLogin yes/PermitRootLogin no/" /etc/ssh/sshd_config
systemctl restart sshd
# 设置时区
timedatectl set-timezone $TIMEZONE
echo "✅ 初始化完成!请检查日志。"

加入错误处理与日志

#!/bin/bash
LOG_FILE="/var/log/init_script.log"
exec > >(tee -a "$LOG_FILE") 2>&1  # 记录所有输出
# 函数:失败时回滚(示例)
rollback() {
    echo "❌ 错误发生在第 $1 行,执行回滚..."
    userdel -r $NEW_USER 2>/dev/null || true
}
trap 'rollback $LINENO' ERR

安全加固(密码不能明文)

# 使用交互式或HASH密码(避免明文)
echo -n "Enter password for $NEW_USER: "
read -s PASSWORD
echo "$NEW_USER:$PASSWORD" | chpasswd
# 或在脚本中预计算哈希值
# echo "$NEW_USER:$(openssl passwd -6 'YourPassword')" | chpasswd

使用云平台User Data(以AWS为例)

在EC2启动时,将脚本放入User data字段即可自动执行:

#!/bin/bash
# 在云平台中自带获取元数据能力
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
echo "初始化实例: $INSTANCE_ID" 
# 后续与标准脚本一致

常见问答(Q&A)

Q1:脚本执行一半失败,系统处于不一致状态怎么办?
A:使用幂等设计,每次执行前检查目标状态,如果已配置则跳过,例如if id "deployer" &>/dev/null; then echo "用户已存在,跳过创建"; fi

Q2:Windows系统如何写初始化脚本?
A:使用PowerShell脚本,并结合Desired State Configuration (DSC),示例:

# 设置时区
Set-TimeZone -Id "China Standard Time"
# 创建用户
New-LocalUser -Name "deployer" -Password (ConvertTo-SecureString "P@ssw0rd" -AsPlainText -Force)
Add-LocalGroupMember -Group "Administrators" -Member "deployer"

Q3:如何防止脚本泄露密码?
A:使用环境变量或云平台的密钥管理服务(如AWS Secrets Manager),仅在运行时读取。

Q4:多个脚本如何组织成完整体系?
A:采用模块化设计,将“系统更新”、“用户管理”、“防火墙配置”分离为独立函数,主脚本按序调用。


最佳实践与避坑指南

最佳实践 说明
幂等性 同一脚本运行多次结果一致,不产生重复条目
测试环境先行 先用容器(Docker)或虚拟机测试全部路径
版本控制 脚本必须放入Git仓库,每个变更走PR流程
日志记录 记录每条命令的执行结果,方便排错
超时与重试 网络不稳定时,设置retry机制(如apt-get -o DPkg::LockTimeout=60
最小权限 脚本运行后禁用root直接登录,使用sudo提权

避坑案例

  • ❌ 写死rm -rf /some/path 但路径拼写错误 → 严重后果
  • ✅ 使用变量$TARGET_DIR并提前校验目录是否存在
  • ❌ 直接使用ssh-copy-id无密码登录 → 被自动工具破解
  • ✅ 配置公钥后立即关闭密码登录

系统初始化配置脚本是运维自动化的第一步,也是迈向“基础设施即代码”(Infrastructure as Code)的关键,无论是单台服务器还是云计算环境,掌握如何编写一个可靠、安全、幂等的初始化脚本,能显著提升部署效率、降低人为故障率。

核心要点回顾

  1. 梳理清晰配置清单,按依赖排序
  2. 使用幂等逻辑,支持重复执行
  3. 加入日志、错误处理与回滚机制
  4. 绝对不要硬编码敏感信息
  5. 先在测试环境验证,再推广到生产

从现在开始,将你的每次手动“配系统”过程,编写成可复用的脚本,你会在后续的工作中获得数倍的回报。

抱歉,评论功能暂时关闭!