wait_for_connection模块不重装系统,仅在重装后精准等待SSH连接就绪;需嵌入含超时、重试、并发控制的自动化流程,配合reboot或手动重启使用,并与幂等初始化任务组合实现大批量物理服务器“自动复活”。

Ansible 的 wait_for_connection 模块本身**不负责重装系统**,也不直接“秒级复活”,但它是在系统重装后、SSH 服务恢复前**精准等待连接就绪**的关键环节。真正实现“大批量物理服务器重装后自动续跑任务”的核心,是将它嵌入一个**可靠、可中断、带超时与重试的自动化流程中**。重点不在“秒级”,而在“稳准快”——避免因连接未就绪导致后续 Playbook 报错中断。
明确 wait_for_connection 的定位和典型用法
wait_for_connection 是一个 连接探活模块,运行在控制节点上,持续尝试 SSH 连接到目标主机(默认端口 22),直到成功建立连接或超时。它不执行任何远程命令,也不关心系统是否完成初始化(如 networkmanager 启动、hostname 设置等),只认 SSH daemon 是否响应。
常见写法示例:
- name: 等待重装后 SSH 可达
ansible.builtin.wait_for_connection:
delay: 10 # 首次检查前等待 10 秒(给系统启动留缓冲)
timeout: 600 # 最多等 10 分钟(物理机 BIOS/RAID 卡自检耗时长,需放宽)
sleep: 15 # 每次失败后隔 15 秒再试(避免密集探测拖慢控制节点)
与重装动作形成闭环:必须配合 reboot 或 async + poll
单纯写 wait_for_connection 没有意义。它必须紧跟在触发重装(如调用 PXE/Kickstart/API)或重启操作之后。物理服务器重装后必然经历断连 → BIOS → RAID → OS 加载 → SSH 启动过程,这个过程不可跳过。
推荐两种衔接方式:
-
使用
reboot模块(推荐):Ansible 2.7+ 原生支持安全重启,并内置连接等待逻辑。它会在发起 reboot 后自动调用 wait_for_connection,且支持 post_reboot_delay 控制重启后延迟再探活。 -
手动组合 reboot + wait_for_connection:若用 shell 调用 ipmitool/reboot 命令,则必须显式跟一个
wait_for_connection任务,否则后续任务会立即失败。
支撑大批量并发:控制策略与容错设计
对上百台物理机批量操作,“自动复活”失败往往源于并发失控或单点异常。需在 playbook 层面约束:
-
限制并发数(
serial):设为serial: 10或按机柜分组,防止控制节点网络/SSH 连接池打满,也便于定位哪台卡住。 -
启用连接重试(
max_fail_percentage/ignore_errors谨慎用):对个别长期失联节点,可先标记跳过,最后统一人工介入,而非让整批 halt。 -
结合 inventory 动态分组:例如按
reinstall_state: pending标记待重装主机,Playbook 执行完重装后,用另一个 Playbook 专扫reinstall_state: done主机并执行wait_for_connection+ 后续配置,解耦更清晰。
真正的“自动复活” = wait_for_connection + 后续幂等任务
所谓“复活”,是指系统上线后自动完成标准初始化:如配置时间同步、部署监控 agent、拉取应用镜像、注册到 CMDB 等。这些必须全部使用 幂等模块(如 ansible.builtin.copy、community.general.systemd、ansible.builtin.apt)编写,确保即使某台机器 wait 成功但后续某步失败,重跑 Playbook 也不会重复出错。
一个最小可行结构示意:
- name: 批量重装后自动初始化
hosts: servers_to_revive
serial: 8
tasks:
- name: 等待 SSH 连通(含合理超时)
ansible.builtin.wait_for_connection:
delay: 30
timeout: 900
sleep: 20
<pre class="brush:php;toolbar:false;">- name: 同步系统时间(幂等)
community.general.systemd:
name: systemd-timesyncd
state: started
enabled: yes
- name: 安装基础工具(幂等)
ansible.builtin.apt:
name: ["curl", "jq", "rsync"]
state: present
update_cache: true


















