目标
批量初始化最怕的不是命令多,而是每次都不一样。真正能落地的做法,不是堆一堆 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
这一步的意义是把失败提前到最前面,避免跑到一半才发现提权不通。
基础动作只保留四类
我最后收成了四个固定动作:
- 基础账号和公钥
- 时间同步
- 系统基线参数
- 常用工具包
- 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、账号治理和巡检都能接在同一条线上。
发表回复