如何在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前置检查
如果不想以报错的方式终止,而是优雅停止,可以用全局标记变量来控制:
- 在触发终止的任务中,设置一个可跨Play共享的缓存标记:
- name: 设置终止标记 ansible.builtin.set_fact: stop_all_plays: true cacheable: true when: dir_check_result.stat.size == 0
- 在每个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
相关产品推荐
相关产品推荐

