ansible 暂停无法与 when 条件配合使用

ansible 暂停无法与 when 条件配合使用

示例游戏:

- 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:设置为检查任务是否返回成功的表达式。

编写脚本来确认某件事已经发生,即使在任务返回后需要一些时间,也可以有利于自动化。一个剧本可以继续进行,并执行列表中的下一件事。尽管在关键点上,根据工作流程,人工输入可能是一个好主意。

相关内容