Ansible pause模块结合when条件执行异常问题求助
Ansible pause模块结合when条件执行异常问题求助
我遇到一个Ansible的问题,写了下面的playbook:
- name: WTF debug: msg: 'THIS WORKS "{{ inventory_hostname }} UPGRADE VAR IS "{{ upgrade }}"' when: upgrade and inventory_hostname is regex("switch.*a") - name: Wait for routes to be removed pause: prompt: "Wait 30 seconds or so for routes to be removed, push enter when ready" when: upgrade and inventory_hostname is regex("switch.*a")
debug任务执行完全正常,但pause任务却有问题:当用--limit指定单台主机时,pause能正常运行;但针对主机组执行时,只有组里第一台符合条件的主机能触发pause,剩下的都不会执行。我没办法用wait_for模块,因为必须等用户手动按回车确认才行,有没有大佬知道怎么解决这个问题?
问题原因&解决方案
这个问题其实是Ansible并行执行机制导致的——默认情况下Ansible会同时处理多台主机(forks数默认是5),而pause模块的交互式prompt只能响应第一个进入该任务的主机,后续主机的pause任务会被自动跳过,因为Ansible没法同时处理多个交互式输入请求。
给你两个可行的解决思路:
1. 串行执行play(推荐,符合逐台确认需求)
在play级别加上serial: 1,让Ansible逐个处理主机,这样每台符合条件的主机都会依次触发pause交互,你需要逐个确认:
- name: 升级流程任务 hosts: your_target_group serial: 1 # 开启串行执行,一台主机处理完再执行下一台 tasks: - name: 输出主机升级信息 debug: msg: 'THIS WORKS "{{ inventory_hostname }} UPGRADE VAR IS "{{ upgrade }}"' when: upgrade and inventory_hostname is regex("switch.*a") - name: 等待路由清除(手动确认) pause: prompt: "Wait 30 seconds or so for routes to be removed, push enter when ready" when: upgrade and inventory_hostname is regex("switch.*a")
2. 只触发一次全局确认(如果不需要逐台确认)
如果你的场景只需要一次全局确认,不需要每台主机都手动确认,可以给pause任务加上run_once: true,这样不管多少台符合条件的主机,只会触发一次pause:
- name: Wait for routes to be removed (全局一次确认) pause: prompt: "Wait 30 seconds or so for routes to be removed, push enter when ready" when: upgrade and inventory_hostname is regex("switch.*a") run_once: true
根据你的描述,你应该是需要逐台确认,所以第一种串行执行的方案更适合你。
备注:内容来源于stack exchange,提问作者Dave0
相关产品推荐
相关产品推荐

