Aching Notes

技术笔记、折腾记录和长期项目整理

Linux 批量初始化收口成一套固定流程

目标

批量初始化最怕的不是命令多,而是每次都不一样。真正能落地的做法,不是堆一堆 shell,而是把初始化收口成一条固定路径:

  • 先确认能连、能提权
  • 再铺基础账号、时间同步、工具包
  • 最后做验收和留档

这样后续不管是 5 台还是 50 台,流程都一致。

目录先定死

我现在会先把项目目录收住,避免脚本散落在桌面和临时目录里。

house-init/
  inventories/prod/hosts.ini
  group_vars/all.yml
  roles/
    bootstrap/
    chrony/
    sysctl/
    base-tools/
  playbooks/
    00-precheck.yml
    10-bootstrap.yml
    20-baseline.yml
    90-verify.yml
  scripts/
    run.sh
    report.py

入口脚本只负责调用 playbook,不在里面写业务逻辑。

#!/usr/bin/env bash
set -euo pipefail

inventory="${1:-inventories/prod/hosts.ini}"
target="${2:-all}"

ansible-playbook -i "$inventory" playbooks/00-precheck.yml --limit "$target"
ansible-playbook -i "$inventory" playbooks/10-bootstrap.yml --limit "$target"
ansible-playbook -i "$inventory" playbooks/20-baseline.yml --limit "$target"
ansible-playbook -i "$inventory" playbooks/90-verify.yml --limit "$target"

前置检查先做薄

初始化前先确认 SSH、sudo、Python 都在,不满足就直接停,不进入后续改动。

- hosts: all
  gather_facts: false
  tasks:
    - name: check ssh
      ansible.builtin.ping:
    - name: check sudo
      ansible.builtin.command: sudo -n true
      changed_when: false
    - name: check python
      ansible.builtin.raw: test -x /usr/bin/python3 || test -x /usr/libexec/platform-python
      changed_when: false

这一步的意义是把失败提前到最前面,避免跑到一半才发现提权不通。

基础动作只保留四类

我最后收成了四个固定动作:

  1. 基础账号和公钥
  2. 时间同步
  3. 系统基线参数
  4. 常用工具包
- name: deploy admin key
  ansible.posix.authorized_key:
    user: sisthy
    key: "{{ lookup('file', 'files/id_ed25519.pub') }}"

- name: install base tools
  ansible.builtin.package:
    name:
      - vim
      - curl
      - bash-completion
      - chrony
    state: present

sysctl 也尽量模板化,别一台机器一个写法。

- name: set baseline sysctl
  ansible.posix.sysctl:
    name: net.ipv4.ip_forward
    value: "0"
    state: present
    reload: yes

验收比执行更重要

我不把“脚本跑完”当结束,只把“验收通过”当结束。

ansible -i inventories/prod/hosts.ini all -m shell -a 'hostnamectl; timedatectl status | sed -n "1,8p"; sudo -n true'

验收时只看三类结果:

  • 哪台机器通过
  • 哪台机器失败
  • 哪一步失败

不要把整段原始输出直接塞进报告,报告不是日志转储。

失败怎么处理

初始化失败后,我会把错误分成三类:

  • 连通性问题
  • 权限问题
  • 目标系统差异问题

这三类对应的处理完全不一样。比如连通性问题应该重试,权限问题应该回头查账号,系统差异问题则需要补适配,不适合盲跑。

回滚边界

初始化脚本只改这几类内容:

  • 账号
  • 公钥
  • sudo 规则
  • 时间同步
  • 基础工具

不碰业务配置,不动数据盘,不写应用目录。这样一旦出问题,回滚范围是明确的。

结论

批量初始化真正要收口的不是命令,而是流程。只要把“前置检查 -> 基础铺设 -> 验收留档”固定下来,后面的 swap、sysctl、账号治理和巡检都能接在同一条线上。


已发布

分类

来自

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注