示例游戏:
- 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")
调试工作正常,但暂停任务从未运行。 when
条件相同。如果我对单个主机运行此操作,它--limit myhost
工作正常,但是对一组主机运行它,暂停任务对第一个主机有效,但对其余主机无效
wait_for
对我来说没什么用,因为我需要等待用户按下return
我知道该如何做吗?
答案1
pause
是一个动作插件,它做了一件不常见的事:它绕过了主机循环。其效果与强制相同,run_once: true
也就是说,即使针对多个主机,也只运行一次。(实现在策略插件代码中。)
这是插件文档中“bypass_host_loop full”属性的含义,您可以通过运行以下命令在 CLI 上阅读ansible-doc pause
这样做的代码意味着作者从来不想处理多个主机。这对于屏幕输入插件来说很有意义,但处理重复交叉的主机将是一场噩梦。
- name: Wait for routes to be removed
wait_for:
timeout: 30
# no point in uploading code just to sleep to remote hosts
# although that could work if the remote host has Python
delegate_to: localhost
wait_for
是可以用作“休眠此秒数”计时器的替代方案。但是,用户输入不再是一种选择。
请注意,播放时间可能不是主机数乘以超时秒数。因为主机循环可以并行运行多个主机。
另一种选择是检查要发生的事情的任务,也许是轮询。假设没有专门的模块可以同步等待,可以用until
: 环形. 在查询“路线是否被删除”的任务上:将delay:
任务关键字设置为最短可行秒数,并将其until:
设置为检查任务是否返回成功的表达式。
编写脚本来确认某件事已经发生,即使在任务返回后需要一些时间,也可以有利于自动化。一个剧本可以继续进行,并执行列表中的下一件事。尽管在关键点上,根据工作流程,人工输入可能是一个好主意。