Ansible Игнорировать ошибки в задачах и сбой в конце игровой книги, если у каких-либо задач были ошибки

Я изучаю Ansible. У меня есть учебник для очистки ресурсов, и я хочу, чтобы в плейер-плейере игнорировались все ошибки и продолжались до конца, а затем завершались в конце, если были ошибки.

Я могу игнорировать ошибки с помощью

  ignore_errors: yes

Если бы это была одна из задач, я мог бы сделать что-то вроде (от непонятной ошибки)

- name: this command prints FAILED when it fails
  command: /usr/bin/example-command -x -y -z
  register: command_result
  ignore_errors: True

- name: fail the play if the previous command did not succeed
  fail: msg="the command failed"
  when: "'FAILED' in command_result.stderr"

Как я могу потерпеть неудачу в конце? У меня есть несколько задач, каково было бы мое условие "Когда"?

Ответ 1

Используйте Fail.

  • Используйте ignore_errors с каждой задачей, которую вам нужно игнорировать в случае ошибок.
  • Установите флаг (скажем, result = false) всякий раз, когда происходит сбой при выполнении любой задачи
  • В конце игровой книги проверьте, установлен ли флаг, и в зависимости от этого не выполняется выполнение
- fail: msg="The execution has failed because of errors."
  when: flag == "failed"

Обновление:

Используйте регистр, чтобы сохранить результат задачи, как показано в примере. Затем используйте следующую задачу:

- name: Set flag
  set_fact: flag = failed
  when: "'FAILED' in command_result.stderr"

Ответ 2

Вы можете обернуть все задачи, которые могут сбой в блоке, и использовать ignore_errors: yes с этим блоком.

tasks:
  - name: ls
    command: ls -la
  - name: pwd
    command: pwd

  - block:
    - name: ls non-existing txt file
      command: ls -la no_file.txt
    - name: ls non-existing pic
      command: ls -la no_pic.jpg
    ignore_errors: yes 

Подробнее о ошибке в блоках.

Ответ 3

Модуль сбоев отлично работает! Спасибо.

Мне нужно было определить свой факт перед его проверкой, иначе я бы получил ошибку переменной undefined.

И у меня были проблемы при настройке факта с помощью кавычек и без пробелов.

Это сработало:

set_fact: flag="failed"

Это забросило ошибки:

set_fact: flag = failed