Spec-Zone.ru › Ansible 2.11

Блоки

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

  • Группировка задач с помощью блоков
  • Обработка ошибок с помощью блоков

Группировка задач с помощью блоков

Все задачи в блоке наследуют директивы, применённые на уровне блока. Большинство того, что можно применить к отдельной задаче (за исключением циклов), можно применить на уровне блока, поэтому блоки значительно упрощают установку данных или директив, общих для задач. Директива не влияет на сам блок, она наследуется только задачами, заключёнными в блок. Например, инструкция when применяется к задачам внутри блока, а не к самому блоку.

Пример блока с именованными задачами внутри блока
 tasks:
   - name: Install, configure, and start Apache
     block:
       - name: Install httpd and memcached
         ansible.builtin.yum:
           name:
           - httpd
           - memcached
           state: present

       - name: Apply the foo config template
         ansible.builtin.template:
           src: templates/src.j2
           dest: /etc/foo.conf

       - name: Start service bar and enable it
         ansible.builtin.service:
           name: bar
           state: started
           enabled: True
     when: ansible_facts['distribution'] == 'CentOS'
     become: true
     become_user: root
     ignore_errors: yes

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

Имена для блоков доступны начиная с Ansible 2.3. Мы рекомендуем использовать имена во всех задачах, внутри блоков или где-либо ещё, для лучшей видимости задач, выполняемых при запуске книги задач.

Обработка ошибок с помощью блоков

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

Блоки rescue содержат задачи, которые выполняются при ошибке предыдущей задачи в блоке. Этот подход похож на обработку исключений во многих языках программирования. Ansible выполняет блоки rescue только после того, как задача вернула состояние ‘failed’. Ошибочные определения задач и недостижимые хосты не будут вызывать блок rescue.

Пример обработки ошибок блока
 tasks:
 - name: Handle the error
   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, can do stuff here to fix it, :-)'

Вы также можете добавить секцию always в блок. Задачи в секции always выполняются независимо от статуса задачи предыдущего блока.

Блок с секцией always
 - name: Always do X
   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 :-('
   always:
     - name: Always do this
       ansible.builtin.debug:
         msg: "This always executes, :-)"

Вместе эти элементы обеспечивают сложную обработку ошибок.

Блок со всеми секциями
- 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"

Задачи в block выполняются нормально. Если какие-либо задачи в блоке возвращают failed, секция rescue выполняет задачи для восстановления от ошибки. Секция always выполняется независимо от результатов секций block и rescue.

Если в блоке произошла ошибка и задача rescue выполнена успешно, Ansible отменяет состояние ошибки исходной задачи для выполнения и продолжает выполнение книги задач так, как если бы исходная задача завершилась успешно. Задача rescue считается успешной и не вызывает срабатывания конфигураций max_fail_percentage или any_errors_fatal. Однако Ansible всё ещё сообщает об ошибке в статистике книги задач.

Вы можете использовать блоки с flush_handlers в задаче rescue, чтобы гарантировать, что все обработчики выполнятся, даже если произойдёт ошибка:

Выполнение обработчиков блока при ошибке
 tasks:
   - name: Attempt and graceful roll back demo
     block:
       - name: Print a message
         ansible.builtin.debug:
           msg: 'I execute normally'
         changed_when: yes
         notify: run me even after an error

       - name: Force a failure
         ansible.builtin.command: /bin/false
     rescue:
       - name: Make sure all handlers run
         meta: flush_handlers
 handlers:
    - name: Run me even after an error
      ansible.builtin.debug:
        msg: 'This handler runs even on error'

Новое в версии 2.1.

Ansible предоставляет несколько переменных для задач в части rescue блока:

ansible_failed_task

Задача, которая вернула ‘failed’ и вызвала rescue. Например, чтобы получить имя, используйте ansible_failed_task.name.

ansible_failed_result

Захваченный результат возврата завершившейся неудачно задачи, которая вызвала rescue. Это равносильно использованию этой переменной в ключевом слове register.

См. также

Введение в книги задач

Введение в книги задач

Роли

Организация книг задач по ролям

Список рассылки пользователей

Есть вопрос? Зайдите на форум Google!

irc.freenode.net

IRC-чат-канал #ansible

© 2012–2018 Michael DeHaan
© 2018–2021 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.11/user_guide/playbooks_blocks.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API