You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ansible任务中终止playbook内所有play的执行?

解决Ansible终止整个Playbook执行的问题

在Ansible Core 2.16.3里,要通过单个任务终止所有Play的执行,这里有两种实用方法:

方法1:全局错误致命配置 + 失败模块

这种方法通过让任务失败触发整个Playbook终止,步骤如下:

  • 在Playbook最顶部加上any_errors_fatal: true,这个配置会让任意任务失败时直接停掉整个Playbook,而不是只终止当前Play。
  • 在需要触发终止的地方,判断目录为空的条件满足后,调用fail模块抛出错误。

修改后的transfer-files.yml示例:

---
any_errors_fatal: true

- name: 针对host1的Play
  hosts: host1
  vars:
    TRANSFER_FILES_MODE: mode1
  roles:
    - transfer_files
  tasks:
    - name: 检查目标目录是否为空
      ansible.builtin.stat:
        path: /你的目标目录路径
      register: dir_check_result

    - name: 目录为空则终止整个Playbook
      ansible.builtin.fail:
        msg: "目标目录为空,终止所有Play执行"
      when: dir_check_result.stat.size == 0

- name: 针对host2的Play
  hosts: host2
  vars:
    TRANSFER_FILES_MODE: mode2
  roles:
    - transfer_files

方法2:全局缓存标记 + 各Play前置检查

如果不想以报错的方式终止,而是优雅停止,可以用全局标记变量来控制:

  1. 在触发终止的任务中,设置一个可跨Play共享的缓存标记:
- name: 设置终止标记
  ansible.builtin.set_fact:
    stop_all_plays: true
  cacheable: true
  when: dir_check_result.stat.size == 0
  1. 在每个Play的最前面加一个前置任务,检查这个标记,若标记存在则终止当前Play:
- name: 针对host1的Play
  hosts: host1
  vars:
    TRANSFER_FILES_MODE: mode1
  pre_tasks:
    - name: 若全局终止标记已设置则停止当前Play
      ansible.builtin.meta: end_play
      when: stop_all_plays is defined and stop_all_plays
  roles:
    - transfer_files

- name: 针对host2的Play
  hosts: host2
  vars:
    TRANSFER_FILES_MODE: mode2
  pre_tasks:
    - name: 若全局终止标记已设置则停止当前Play
      ansible.builtin.meta: end_play
      when: stop_all_plays is defined and stop_all_plays
  roles:
    - transfer_files

注意:cacheable: true依赖Ansible默认启用的fact缓存,这样标记变量才能在不同Play之间共享。

内容的提问来源于stack exchange,提问作者nabello

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 09:43:34