Spec-Zone.ru › Ansible 2.5

Блоки

Блоки позволяют логически сгруппировать задачи и обрабатывать ошибки во время выполнения. Большинство настроек, применимых к отдельной задаче, могут быть применены на уровне блока, что также значительно упрощает настройку данных или директив, общих для задач. Это не означает, что директива влияет на сам блок, но она наследуется задачами, заключенными в блок. Например, 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'

См. также

Работа с playbook
Введение в playbook
Роли
Организация playbook с помощью ролей
Список рассылки пользователей
Есть вопрос? Заходите на форум!
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.5/user_guide/playbooks_blocks.html

Spec-Zone.ru

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