Ansible异步任务用于提升耗时操作执行效率:通过async设置最长运行时间、poll设置轮询间隔,支持后台执行(poll:0)或定期检查状态;需结合free策略、serial分批及throttle限流确保千级节点部署稳定高效。

Ansible 默认同步执行任务,遇到耗时操作(比如大文件下载、软件安装、编译构建)会卡住整个流程,拖慢千级节点部署节奏。异步任务就是让这类操作“扔后台跑”,Ansible 不等它结束就继续调度其他任务,大幅提升吞吐效率。
什么时候该用 async
适合执行时间明显长于 SSH 超时(默认 10 秒)、且无需立即确认结果的任务:
- 下载几百 MB 的 ISO 或安装包(get_url)
- 运行自定义安装脚本(shell 或 command)
- 启动服务后等待初始化完成(如数据库首次启动)
- 日志上报、通知类“发完即走”的操作
注意:copy、file、apt 等短任务保持同步更高效;async 有轮询开销,别滥用。
async + poll 的基本写法
核心是两个参数:async(最长允许运行秒数)和 poll(轮询间隔秒数):
- poll: 10 → 每 10 秒查一次任务是否完成,直到超时或成功
- poll: 0 → 完全不等待,Ansible 立即返回,任务在目标机后台持续运行
示例:后台解压大包,最多等 1800 秒(30 分钟),每 20 秒检查一次
- name: Extract large archive shell: tar -xf /tmp/app.tar.gz -C /opt/ async: 1800 poll: 20
如何跟踪异步任务状态
启用 async 后,Ansible 会返回一个 ansible_job_id。后续可用 async_status 模块主动查进度:
- name: Start long task
shell: sleep 120
async: 300
poll: 0
register: long_task
<ul><li>name: Check status later
async_status:
jid: "{{ long_task.ansible_job_id }}"
register: job_result
until: job_result.finished
retries: 30
delay: 10这相当于手动实现“等待完成”,适合需要确保前置任务落地再执行后续步骤的场景。
配合策略与分批提升稳定性
单靠 async 不够,还要结合执行策略和并发控制:
- 对千级节点,改用 strategy: free —— 主机执行完当前任务就立刻进下一个,不等全部主机同步完成
- 用 serial: 5% 或 serial: 20 分批滚动执行,避免控制节点或目标节点过载
- 敏感任务(如数据库变更)单独设低 forks(如
-f 4)或加 throttle: 1 限流
这些组合能兼顾速度与可靠性,不是只调 async 就万事大吉。


















