Блоки
В версии 2.0 мы добавили функцию блоков для логической группировки задач и даже обработки ошибок в процессе выполнения. Большинство настроек, которые можно применить к отдельной задаче, применимы и на уровне блока, что значительно упрощает настройку данных или директив, общих для задач. Это не означает, что директива влияет на сам блок, а наследуется задачами, заключёнными в блоке. Например, 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 из блока и его оценки в контексте задачи. Также они унаследуют директивы повышения привилегий, позволяющие выполнять «become root» для всех заключённых задач.
Введено в версии 2.3: Ключевое слово name: для blocks: было добавлено в Ansible 2.3.
Обработка ошибок
Блоки также позволяют обрабатывать ошибки подобно исключениям в большинстве языков программирования.
tasks:
- name: Attempt and gracefull 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 или нет.
Ещё один пример — как запускать обработчики после возникновения ошибки:
tasks:
- name: Attempt and gracefull 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'
См. также
- Сценарии
- Введение в сценарии
- Роли
- Организация сценариев с помощью ролей
- Пользовательская рассылка
- Есть вопрос? Задайте его в группе!
- 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.4/playbooks_blocks.html