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