Работа с ошибками

При получении ненулевого возврата от команды или ошибку от модуля, ансибл по умолчанию прекращает выполнение. Есть параметры для изменения поведения:

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"