Ansible 2.0.0中async模块poll=0模式下任务无法完成问题
解决Ansible 2.0.0异步任务获取结果时的条件判断失败问题
你在使用Ansible 2.0.0这个老版本处理异步任务时踩了典型的版本兼容性坑——提交2分钟的ping异步任务(poll=0)后,跑完短任务再获取结果时触发了条件判断相关报错。下面给你拆解问题原因和适配旧版本的解决办法:
问题根源
Ansible 2.0.0作为早期版本,async_status模块返回的结果结构和后续新版本差异很大。你大概率是在判断任务状态时用了新版本的字段(比如failed、status),但在2.0.0中,任务未完成时这些字段根本不存在,直接引用就会触发"ERROR! The conditional..."这类变量未定义的报错。
适配Ansible 2.0.0的完整Playbook示例
重点注意异步任务的注册逻辑和结果判断的字段选择:
- name: 处理异步ping任务及后续流程 hosts: remote_host tasks: # 提交持续2分钟的异步ping任务,poll=0表示立即返回不等待 - name: 启动长时间ping任务 command: ping -c 120 localhost # -c 120对应每秒1次,持续2分钟 async: 120 # 异步超时时间必须≥任务实际耗时,否则会被强制终止 poll: 0 register: ping_task # 执行后续2-3个短任务(总耗时≤1分钟) - name: 执行短任务1 command: echo "完成短任务1" - name: 执行短任务2 command: echo "完成短任务2" # 轮询获取异步任务结果,这一步是核心修复点 - name: 等待ping任务完成并拉取结果 async_status: jid: "{{ ping_task.ansible_job_id }}" register: ping_result until: ping_result.finished == 1 # Ansible 2.0.0仅支持用finished判断:1=完成,0=未完成 retries: 6 # 重试次数,按10秒间隔算,6次刚好覆盖剩余1分钟等待时间 delay: 10 # 每次轮询的间隔时间
关键注意事项
- 必须用
finished字段判断状态:在Ansible 2.0.0中,async_status返回的结果里只有finished是稳定存在的字段——任务未完成时为0,完成后为1。如果误用ping_result.failed等字段,在任务未完成阶段这些字段不存在,就会触发你遇到的条件判断报错。 async参数不能小于任务耗时:如果设置的async数值比实际任务运行时间短,Ansible会直接终止异步任务,导致后续无法获取有效结果。- 合理配置
retries和delay:两者的乘积要大于等于异步任务剩余的运行时间(比如后续任务耗时1分钟,ping任务还剩1分钟,设置retries:6+delay:10刚好覆盖60秒)。
额外建议
Ansible 2.0.0确实存在大量未修复的bug和特性缺失,如果业务允许的话,尽量升级到2.9及以上的稳定版本,能避免很多这类兼容性问题。
内容的提问来源于stack exchange,提问作者Harsha S Adiga
相关产品推荐
相关产品推荐

