Ansible – Продолжить (не игнорировать) после Ошибки

Вопрос или проблема

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

Чтобы проиллюстрировать, в данный момент у меня следующий ‘RUN-RECAP’:

PLAY RECAP *******************************************************************************************************************************************************************************************
<server>                  : ok=195  changed=0    unreachable=0    failed=0    skipped=0    rescued=0    **ignored=10**

“ignored=10” на самом деле означает “сбой проверки”. То, что мне нужно, выглядело бы как:

PLAY RECAP *******************************************************************************************************************************************************************************************
<server>                  : ok=195  changed=0    unreachable=0    **failed=10**    skipped=0    rescued=0    ignored=0

Относительно вашего вопроса

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

вы можете взглянуть на Обработку ошибок в плейбуках и Определение сбоя, так

как Ansible позволяет вам определять, что означает “сбой” в каждой задаче с помощью условия failed_when.

а также Обработка ошибок с помощью blocks.

Один из подходов, который вы могли бы использовать, это игнорирование ошибок, но сохранение условия сбоя в переменную, и проверка состояния этой переменной в последней задаче плейбука. Таким образом:

  • Все ваши задачи будут попытаны, независимо от ошибок
  • Плейбук в целом потерпит неудачу, если любая из ваших задач потерпит провал, так что в конце отчета вы увидите успех или провал и сможете использовать код возврата команды, если это необходимо
  • Сбой задачи выделяется красным по умолчанию, даже если он игнорируется, так что их сообщения легко найти в выводе плейбука.
  • Это также работает с циклами, так как зарегистрированный вывод имеет свое собственное свойство failed, которое отмечает, если какой-либо из элементов цикла потерпел неудачу.

Например:

  - set_fact:
      global_fail: false

  - name: Assert the state of something
    ansible.builtin.assert:
      that:
        - <условие, которое вы хотите проверить>
      success_msg: ...
      fail_msg: ...
    register: assert_task
    ignore_errors: true

  - set_fact:
      global_fail: "{{ global_fail or (assert_task.failed is defined and assert_task.failed) }}"

  <Дальнейшие задачи здесь>

  - name: Assert that no tasks failed
    ansible.builtin.assert:
      that:
        - not global_fail
      success_msg: "Все задачи выполнены успешно"
      fail_msg: "Одна или несколько задач потерпели неудачу"

Ответ или решение

Вопрос о том, как продолжить выполнение плейбука Ansible, не игнорируя ошибки, но при этом завершая выполнение до конца, действительно актуален для эффективного управления отчетностью и аналитикой.
Чтобы достичь этой цели, важно не просто скрывать ошибки, а правильно управлять их последствиями. Вот как можно это сделать:

  1. Понимание механизма ошибок:
    В Ansible у вас есть возможность определить, что именно считается ошибкой, используя директиву failed_when. Это дает гибкость в установлении условий, при которых задача может быть помечена как неудачная.

  2. Работа с блоками и обработка ошибок:
    Ansible позволяет использовать структуры типа block, которые обеспечивают более комплексное управление ошибками. Вы можете включать ошибки в блоки и обрабатывать их отдельно, что позволяет продолжить выполнение в рамках блока даже при возникновении ошибок. Это полезно, когда вам нужно логировать ошибки, но не останавливать выполнение скрипта.

  3. Использование переменных для контроля ошибок:
    Попробуйте подход, при котором ошибки игнорируются, но их состояния сохраняются в переменных. Затем выполните проверку этих переменных в конце плейбука. Это удобно, так как:

    • Все задачи выполняются, независимо от возникновения ошибок.
    • Если какая-либо задача неудачна, весь плейбук будет признан неудачным. Вы получите отчет с корректным числом ошибок.
    • Ошибки задач будут выделены в выводе плейбука, чтобы вы могли их легко идентифицировать.

    Пример использования:

    - set_fact:
       global_fail: false
    
    - name: Проверка условия
     ansible.builtin.assert:
       that:
         - <ваше_условие>
       success_msg: "Успешное выполнение условия"
       fail_msg: "Ошибка выполнения условия"
     register: assert_task
     ignore_errors: true
    
    - set_fact:
       global_fail: "{{ global_fail or (assert_task.failed is defined and assert_task.failed) }}"
    
    <Дополнительные задачи>
    
    - name: Проверка отсутствия ошибок
     ansible.builtin.assert:
       that:
         - not global_fail
       success_msg: "Все задачи выполнены успешно"
       fail_msg: "Одна или более задач завершились ошибкой"
  4. Управление отчетностью:
    В конце плейбука добавьте сводный отчет, который будет четко отражать количество задач, окончившихся с ошибками. Для этого можно использовать критические переменные и выводить их значения.

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

Используя эти методики, вы сможете обеспечить не просто выполнение плейбука до конца, но и получать исчерпывающие и точные отчеты, что ключевое для анализа и будущих улучшений процессов автоматизации.

Оцените материал
Добавить комментарий

Капча загружается...