Spec-Zone.ru › Ansible 2.8

Блоки

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

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

       - name: apply the foo config template
         template:
           src: templates/src.j2
           dest: /etc/foo.conf
       - name: start service bar and enable it
         service:
           name: bar
           state: started
           enabled: True
     when: ansible_facts['distribution'] == 'CentOS'
     become: true
     become_user: root
     ignore_errors: yes

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

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

Обработка ошибок в блоках

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

Пример обработки ошибок в блоке
 tasks:
 - name: Handle the error
   block:
     - debug:
         msg: 'I execute normally'
     - name: i force a failure
       command: /bin/false
     - debug:
         msg: 'I never execute, due to the above task failing, :-('
   rescue:
     - debug:
         msg: 'I caught an error, can do stuff here to fix it, :-)'

Это позволит «отменить» ошибочное состояние задачи для данного выполнения, и плейбук продолжится так, как если бы задача завершилась успешно.

Также есть раздел always, который выполнится независимо от состояния задачи.

Блок с разделом always
 - name: Always do X
   block:
     - debug:
         msg: 'I execute normally'
     - name: i force a failure
       command: /bin/false
     - debug:
         msg: 'I never execute :-('
   always:
     - debug:
         msg: "This always executes, :-)"

Их можно объединить для сложной обработки ошибок.

Блок со всеми разделами
- name: Attempt and graceful roll back demo
  block:
    - debug:
        msg: 'I execute normally'
    - name: i force a failure
      command: /bin/false
    - debug:
        msg: 'I never execute, due to the above task failing, :-('
  rescue:
    - debug:
        msg: 'I caught an error'
    - name: i force a failure in middle of recovery! >:-)
      command: /bin/false
    - debug:
        msg: 'I also never execute :-('
  always:
    - debug:
        msg: "This always executes"

Задачи в разделе block будут выполняться обычно. Если возникнет ошибка, выполнится раздел rescue, в котором можно выполнить необходимые действия для восстановления после предыдущей ошибки. Раздел always выполнится независимо от того, произошла ошибка в разделах block и rescue или нет. Следует отметить, что плейбук продолжает выполнение, если раздел rescue завершается успешно, так как он «стирает» состояние ошибки (но не отчёт об этом). Это означает, что он не вызовет триггерные настройки max_fail_percentage и any_errors_fatal, но будет отображаться в статистике плейбука.

Ещё один пример: как запустить обработчики после возникновения ошибки:

Блок с запуском обработчиков при ошибке
 tasks:
   - name: Attempt and graceful roll back demo
     block:
       - debug:
           msg: 'I execute normally'
         changed_when: yes
         notify: run me even after an error
       - command: /bin/false
     rescue:
       - name: make sure all handlers run
         meta: flush_handlers
 handlers:
    - name: run me even after an error
      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.

См. также

Работа с плейбуками
Введение в плейбуки
Роли
Организация плейбуков с помощью ролей
Список рассылки пользователей
Есть вопрос? Задавайте его на этом форуме!
irc.freenode.net
#ansible IRC-чат

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

Spec-Zone.ru

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