При получении ненулевого возврата от команды или ошибку от модуля, ансибл по умолчанию прекращает выполнение. Есть параметры для изменения поведения:
ignore_errors
Продолжить выполнение даже если произошел сбой
Сработает только если команда была запущена и вернула «failed». Не сработает при неопределенных переменных, синтаксических ошибках или отсутствие пакетов, сбои соединения и тп
- name: Do not count this as a failure ansible.builtin.command: /bin/false ignore_errors: true
ignore_unreachable
Ошибка недоступности хоста, продолжит выполнение, этот хост похоже исключится из дальнейшей очереди
Так же может не сработать Handler, для этого есть флаг принудительного звонка, «force_handlers»
failed_when
Позволяет самостоятельно указать состояние ошибки, поддерживает «AND/OR»
PS: вместе с «ignore_errors» не работает, она его перебивает
- name: Fail task when both files are identical ansible.builtin.raw: diff foo/file1 bar/file2 register: diff_cmd failed_when: diff_cmd.rc == 0 or diff_cmd.rc >= 2 failed_when: "'FAILED' in diff_cmd.stderr" # тут AND failed_when: - result.rc == 0 - '"No such" not in result.stdout'
changed_when
Изменения на хосте, влияет на звонок Handlers, так же поддерживает AND/OR
- name: Report 'changed' when the return code is not equal to 2 ansible.builtin.shell: /usr/bin/billybass --mode="take me to the river" register: bass_result changed_when: "bass_result.rc != 2" changed_when: False
any_errors_fatal
Прерывает выполнение при получении ошибки. Есть «max_fail_percentage» для указания процента ошибок для выхода
- hosts: somehosts any_errors_fatal: true roles: - myrole - hosts: somehosts tasks: - block: - include_tasks: mytasks.yml any_errors_fatal: true
Аналогично блокам catch/finaly, в ансибле есть «rescure/always»
Применяется к блокам видимо. Если в блоке возникла ошибка а блок rescure выполнился успешно то выполнение продолжается но в логах видно что была ошибка, always выполняется всегда с-но
Хорошая фича, примечательно что напрмиер в хендлерах не работает, т.к. последние не поддерживают блочную систему
tasks: - name: Attempt and graceful roll back demo block: - name: Print a message ansible.builtin.debug: msg: 'I execute normally' - name: Force a failure ansible.builtin.command: /bin/false - name: Never print this ansible.builtin.debug: msg: 'I never execute, due to the above task failing, :-(' rescue: - name: Print when errors ansible.builtin.debug: msg: 'I caught an error' - name: Force a failure in middle of recovery! >:-) ansible.builtin.command: /bin/false - name: Never print this ansible.builtin.debug: msg: 'I also never execute :-(' always: - name: Always do this ansible.builtin.debug: msg: "This always executes"