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

时间:2019-09-10 13:28:45

标签: ansible

我想在4台服务器上一个接一个地运行一些烦人的任务,即以串行方式。但是两者之间会有一个停顿。因此,我在剧本中最后添加了暂停,但是我希望在最后一个服务器上跳过它。否则它将无故等待。请让我知道如何执行此操作。

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

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

2 个答案:

答案 0 :(得分:2)

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

ansible special variables documentation如下定义ansible_play_hosts_all变量

  

该剧所针对的所有主机的列表

该var中的主机列表按在清单中找到的顺序排列。

假设您使用默认广告资源order进行播放,则可以设置一个测试,除非当前主机是列表中的最后一个主机,否则它将触发任务:

when: inventory_hostname != ansible_play_hosts_all[-1]

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

答案 1 :(得分:1)

下面的剧本可以完成任务

- 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

注释

相关问题