Блоки
Блоки позволяют логически сгруппировать задачи и обрабатывать ошибки в плейбуках. Большая часть того, что можно применить к одной задаче (за исключением циклов), может быть применено на уровне блока, что также значительно упрощает настройку данных или директив, общих для задач. Это не означает, что директива влияет на сам блок, но она наследуется задачами, заключенными в блоке. Т.е. when будет применена к задачам, а не к самому блоку.
tasks:
- name: Install, configure, and start Apache
block:
- name: install httpd and memcached
yum:
name:
- httpd
- memcached
state: present
- name: apply the foo config template
template:
src: templates/src.j2
dest: /etc/foo.conf
- name: start service bar and enable it
service:
name: bar
state: started
enabled: True
when: ansible_facts['distribution'] == 'CentOS'
become: true
become_user: root
ignore_errors: yes
В приведенном примере каждая из 3 задач будет выполнена после добавления условия when из блока и его оценки в контексте задачи. Также они наследуют директивы повышения привилегий, позволяющие «стать рутом» для всех вложенных задач. Наконец, ignore_errors: yes будет продолжать выполнение плейбука, даже если некоторые задачи завершатся ошибкой.
Имена задач внутри блоков доступны с Ansible 2.3. Мы рекомендуем использовать имена во всех задачах, внутри блоков или в других местах, для лучшей видимости выполняемых задач при запуске плейбука.
Обработка ошибок блоков
Блоки также вводят возможность обработки ошибок аналогично исключениям в большинстве языков программирования. Блоки обрабатывают только состояние «ошибка» задачи. Ошибки, связанные с плохим определением задачи или недоступностью хоста, не являются «исправимыми» ошибками.
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, :-)'
Это «отменит» состояние ошибки задачи для выполнения, и плейбук продолжится так, как если бы задача выполнилась успешно.
Также есть раздел 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'
changed_when: yes
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
- Задача, которая вернула «ошибка» и вызвала rescue. Например, чтобы получить имя, используйте
ansible_failed_task.name. - ansible_failed_result
- Захваченный результат выполнения задачи, которая завершилась ошибкой и вызвала rescue. Это эквивалентно использованию этой переменной в ключевом слове
register.
См. также
- О плейбуках
- Вступление в плейбуки
- Роли
- Организация плейбуков по ролям
- Список рассылки пользователей
- Есть вопросы? Загляните в группу 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.9/user_guide/playbooks_blocks.html