Automation / 03

我如何整理一台新服务器的初始化步骤

目标不是一条命令装完所有东西,而是让每次变更都可以重复、审阅与回滚。

新机器到手后,我过去会打开旧笔记,逐条复制命令。几个月后,笔记里总会混入只执行过一次的修补,最终谁也说不清一台“标准服务器”应该是什么样。

把工作分成三层

  1. 基础层:时区、主机名、用户、SSH、公钥和系统更新;
  2. 安全层:最小开放端口、登录策略、自动更新和审计;
  3. 服务层:容器运行时、反向代理、监控与具体应用。

分层以后,基础配置可以在所有机器复用,服务差异则留在各自的小文件里。更重要的是,修改防火墙和修改应用不再混在同一次执行中。

先写检查,再写修改

每一步都尽量满足幂等:重复执行不会不断追加配置,也不会改变已经正确的状态。一个很小的例子是创建部署目录:

install -d -m 0750 -o deploy -g deploy /srv/apps

grep -qxF 'deploy ALL=(ALL) NOPASSWD:/usr/bin/systemctl' \
  /etc/sudoers.d/deploy || exit 1

真正的配置工具可以是 Ansible,也可以是一组朴素脚本。重要的是执行前能看到差异,执行后能验证结果。

不要过早关闭当前入口

调整 SSH 端口、密钥或防火墙时,保留当前会话,并用第二个终端验证新连接。只有确认新入口可用后,再收紧旧规则。这条简单习惯避免过不少远程锁死。

用验收清单结束

自动化执行完不代表初始化完成。我会检查:非 root 用户能否登录、时间是否同步、重启后服务是否自启、磁盘告警是否可达、开放端口是否与清单一致,以及恢复入口是否可用。

最后把系统版本、变更提交和执行日期写入一份机器记录。这样半年后重建时,面对的是可以解释的状态,而不是一段考古现场。