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



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

---
- hosts: server1,server2,server3,server4
serial: 1
vars_files:
- ./vars.yml
tasks:
- name: Variable test
pause:
minutes: 1

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

ansible 特殊变量文档对ansible_play_hosts_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

笔记

  • 查看任何/全部
  • 请参阅从容器中提取值
  • 见主机变量

最新更新