Spec-Zone.ru › Ansible

Блоки

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

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

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

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

Пример блока с именованными задачами внутри блока
 tasks:
   - name: Install, configure, and start Apache
     when: ansible_facts['distribution'] == 'CentOS'
     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
     become: true
     become_user: root
     ignore_errors: true

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

Примечание

Все задачи в блоке, включая те, которые включены с помощью include_role, наследуют директивы, применённые на уровне блока.

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

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

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

Блоки rescue определяют задачи, которые выполняются, когда ранее в блоке задача завершилась с ошибкой. Этот подход похож на обработку исключений во многих языках программирования. Ansible выполняет блоки rescue только после того, как задача вернула состояние «сбой». Ошибочные определения задач и недоступные хосты не будут вызывать блок 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
 tasks:
   - 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, :-)"

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

Блок со всеми разделами
 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"

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

Если при выполнении блока возникает ошибка и задача rescue выполняется успешно, Ansible отменяет ошибочное состояние исходной задачи для текущего выполнения и продолжает выполнение книги задач так, как если бы исходная задача завершилась успешно. Восстановленная задача считается успешной и не вызывает 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: true
         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

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

ansible_failed_result

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

Эти переменные можно проверить в rescue разделе:

Использование специальных переменных в разделе rescue.
 tasks:
   - name: Attempt and graceful roll back demo
     block:
       - name: Do Something
         ansible.builtin.shell: grep $(whoami) /etc/hosts

       - name: Force a failure, if previous one succeeds
         ansible.builtin.command: /bin/false
     rescue:
       - name: All is good if the first task failed
         when: ansible_failed_task.name == 'Do Something'
         ansible.builtin.debug:
           msg: All is good, ignore error as grep could not find 'me' in hosts

       - name: All is good if the second task failed
         when: "'/bin/false' in ansible_failed_result.cmd | d([])"
         ansible.builtin.fail:
           msg: It is still false!!!

Примечание

В ansible-core 2.14 или более поздних версиях обе переменные передаются из внутреннего блока во внешний rescue раздел блока при вложенных блоках.

См. также

Книги Ansible задач

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

Роли

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

Общение

Есть вопросы? Нужна помощь? Хотите поделиться своими идеями? Посетите руководство по взаимодействию Ansible

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

Spec-Zone.ru

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