Ansible playbook跳过串行执行中最后一个节点上的任务

Ansible playbook跳过串行执行中最后一个节点上的任务,ansible,Ansible,我想在4台服务器上逐个运行一些ansible任务,即串行方式。但其间会有一段停顿。所以,我在剧本中最后添加了暂停,但我希望在最后一台服务器上跳过它。否则它将毫无理由地等待。请让我知道如何实现这一点 --- - hosts: server1,server2,server3,server4 serial: 1 vars_files: - ./vars.yml tasks: - name: Variable test pause: minute

我想在4台服务器上逐个运行一些ansible任务,即串行方式。但其间会有一段停顿。所以,我在剧本中最后添加了暂停,但我希望在最后一台服务器上跳过它。否则它将毫无理由地等待。请让我知道如何实现这一点

---
- hosts: server1,server2,server3,server4
  serial: 1
  vars_files:
    - ./vars.yml

  tasks:
    - name: Variable test
      pause:
        minutes: 1

这真是一个有趣的问题,迫使我去寻找一个实际的解决方案。这是我想出的最快的一个

定义
ansible\u play\u hosts\u all
变量如下

该剧的目标主机列表

该var中的主机列表的顺序与在清单中找到的顺序相同

如果您为您的游戏使用默认资源清册,您可以设置一个将触发任务的测试,除非当前主机是该列表中的最后一个主机:

when: inventory_hostname != ansible_play_hosts_all[-1]

正如@Vladimir在下面的评论中所报告的,如果您将播放顺序参数从默认值更改为默认值,此方法将中断。

下面的剧本将完成此任务

- hosts: all
  serial: 1

  vars:
    completed: false

  tasks:

    - set_fact:
        completed: true

    - block:
        - debug:
            msg: All completed. End of play.
        - meta: end_play
      when: "groups['all']|
             map('extract', hostvars, 'completed')|
             list is all"

    - name: Variable test
      pause:
        minutes: 1

注释


这正是我想要的,它解决了我的问题。非常感谢:)不要改变。保重。@VladimirBotka:谢谢你回来。考虑到这一点,测试并更新了答案。即使我限制了主机,这个答案正确吗?例如,如果我设置CLI标志
--limit group01a