Ansible异步ad hoc任务未返回job ID无法查询状态如何解决
问题原因
这是Ansible 2.5.x版本的已知行为:ad hoc模式下执行异步任务时,如果指定-P 0(即关闭轮询、后台立即返回),默认标准输出不会打印异步任务的job ID,该输出逻辑在2.6及后续版本已经做了优化。
解决方法
1. 新执行异步任务时主动获取job ID
执行异步ad hoc命令时添加-v(verbose)参数,输出中会直接显示ansible_job_id字段,对应值即为job ID:
ansible all -a "sleep 60" -P 0 -B 86400 -v
拿到ID后即可通过async_status模块查询任务状态:
ansible all -m async_status -a "jid=<替换为实际job ID>"
2. 已运行的异步任务获取job ID
Ansible的异步任务会在远程节点的~/.ansible_async/目录下生成以job ID命名的状态文件,直接遍历该目录即可获取所有未清理的异步任务ID:
# 批量查询所有节点的异步任务ID ansible all -a "ls ~/.ansible_async/"
如果需要查看任务详情,可以直接读取对应ID的文件内容:
ansible <节点名> -a "cat ~/.ansible_async/<替换为job ID>"
优化建议
如果需要长期使用异步任务能力,建议将Ansible升级到2.6及以上版本,该版本起ad hoc异步任务即使不加-v参数,指定-P 0时也会默认返回job ID,无需额外操作。
内容的提问来源于stack exchange,提问作者user252164
相关产品推荐
相关产品推荐

