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