==== Работа с ошибками ==== При получении ненулевого возврата от команды или ошибку от модуля, ансибл по умолчанию прекращает выполнение. Есть параметры для изменения поведения:\\ **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"\\ - 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"