Spec-Zone.ru › Ansible 2.7

Блоки

Блоки позволяют логически сгруппировать задачи и обрабатывать ошибки во время выполнения. Большая часть того, что можно применить к отдельной задаче (за исключением циклов), может быть применено на уровне блока, что также значительно упрощает настройку данных или директив, общих для задач. Это не означает, что директива влияет на сам блок, но наследуется задачами, заключёнными в блоке. Т.е. 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_facts['distribution'] == 'CentOS'
     become: true
     become_user: root

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

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

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

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

Пример обработки ошибок блока
 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, :-)'

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

Также есть раздел 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'
         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
Задача, вернувшая «failed» и вызвавшая обработку rescue. Например, чтобы получить имя, используйте ansible_failed_task.name.
ansible_failed_result
Захваченный результат выполнения задачи, которая завершилась ошибкой и вызвала обработку rescue. Это эквивалентно использованию этой переменной в ключевом слове register.

См. также

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

Spec-Zone.ru

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