Блоки
Блоки позволяют логически сгруппировать задачи и обрабатывать ошибки. Большинство действий, которые можно применить к отдельной задаче, также применимы на уровне блока, что значительно упрощает настройку данных или директив, общих для задач. Это не означает, что директива влияет на сам блок, но наследуется задачами, заключенными в блоке. То есть, 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'
Новое в версии 2.1.
Ansible также предоставляет несколько переменных для задач в части rescue блока:
- ansible_failed_task
- Задача, которая вернула «ошибка» и вызвала обработку ошибок. Например, чтобы получить имя, используйте
ansible_failed_task.name. - ansible_failed_result
- Захваченный результат выполнения задачи, вызвавшей обработку ошибок. Это эквивалентно использованию этой переменной в ключевом слове
register.
См. также
- Работа с Playbook
- Введение в playbooks
- Роли
- Организация Playbook по ролям
- Список рассылки пользователей
- Есть вопрос? Заходите в группу 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.6/user_guide/playbooks_blocks.html