Как прервать выполнение роли ansible не прерывая выполнения следующих ролей?
Для прерывания выполнения текущей роли в Ansible, не прерывая выполнения следующих ролей, можно использовать модуль meta
с действием end_play
, но важно применять его корректно, чтобы завершить только текущую роль, а не весь плейбук. К сожалению, meta: end_play
останавливает выполнение всего плейбука, что не подходит для вашего случая.
Вместо этого, лучше использовать условие failed_when
в задачах и комбинировать его с ignore_errors: yes
на уровне плейбука или задач. Если задача завершится с ошибкой, это остановит текущую роль, но не повлияет на выполнение других ролей.
Подход к прерыванию роли и продолжению выполнения следующих:
- Использование
meta: end_task
для завершения выполнения только текущей задачи:Модуль
meta
может завершить выполнение текущей задачи, но не всей роли. Чтобы прервать роль и перейти к следующим ролям, используйте подход сwhen
иfailed_when
. - Прерывание выполнения роли с
block
иrescue
:123456789101112131415161718---- hosts: allbecome: yesroles:- role: first_role # Эта роль будет выполнена первой- role: second_role # Эта роль будет выполнена даже если первая прервалась# Внутри первой роли (tasks/main.yml)- block:- name: Task that may fail and stop the rolecommand: /bin/falseregister: resultfailed_when: result.rc != 0rescue:- name: Stop this role but continue the playbookmeta: clear_host_errors - Использование
ignore_errors: yes
на уровне роли:Вызов роли с
ignore_errors: yes
в плейбуке позволит продолжить выполнение следующих ролей, даже если текущая роль завершилась с ошибкой.12345678---- hosts: allbecome: yesroles:- role: first_roleignore_errors: yes # Ошибки в этой роли не прервут выполнение других ролей- role: second_role - Условие
when
для прерывания задач:Задачи внутри роли могут быть выполнены или пропущены в зависимости от условий. Используйте
when
для пропуска задач или завершения роли.12345678910# tasks/main.yml в первой роли- name: Check a condition to stop the rolecommand: /bin/falseregister: check_resultfailed_when: check_result.rc != 0- name: Stop further tasks in the rolemeta: end_playwhen: check_result.rc != 0
Однако, важно отметить, что meta: end_play
завершит выполнение всех задач, если оно выполняется вне блока или задачи. Использование block
и rescue
позволит гибко управлять этим поведением.
Эти подходы помогут завершить выполнение роли при возникновении ошибок, но продолжить выполнение последующих ролей в плейбуке Ansible.
Recommended Posts
Плейбук Ansible по развертыванию haproxy
15.02.2024