Spec-Zone.ru › Ansible 2.6

Блоки

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

Пример блока
 tasks:
   - name: Install Apache
     block:
       - yum:
           name: "{{ item }}"
           state: installed
         with_items:
           - httpd
           - memcached
       - template:
           src: templates/src.j2
           dest: /etc/foo.conf
       - service:
           name: bar
           state: started
           enabled: True
     when: ansible_distribution == 'CentOS'
     become: true
     become_user: root

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

Новое в версии 2.3: Ключевое слово name: для block: было добавлено в Ansible 2.3.

Обработка ошибок

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

Пример обработки ошибок в блоке
 tasks:
 - name: Attempt and graceful roll back demo
   block:
     - debug:
         msg: 'I execute normally'
     - command: /bin/false
     - debug:
         msg: 'I never execute, due to the above task failing'
   rescue:
     - debug:
         msg: 'I caught an error'
     - command: /bin/false
     - debug:
         msg: 'I also never execute :-('
   always:
     - debug:
         msg: "This always executes"

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

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

Выполнение обработчиков в блоке при обработке ошибок
 tasks:
   - name: Attempt and graceful roll back demo
     block:
       - debug:
           msg: 'I execute normally'
         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
Задача, которая вернула «ошибка» и вызвала обработку ошибок. Например, чтобы получить имя, используйте ansible_failed_task.name.
ansible_failed_result
Захваченный результат выполнения задачи, вызвавшей обработку ошибок. Это эквивалентно использованию этой переменной в ключевом слове register.

См. также

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

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

Spec-Zone.ru

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