Блоки
Блоки создают логические группы задач. Блоки также предлагают способы обработки ошибок задач, аналогичные обработке исключений во многих языках программирования.
Группировка задач с помощью блоков
Все задачи в блоке наследуют директивы, применённые на уровне блока. Большая часть того, что можно применить к отдельной задаче (за исключением циклов), может быть применено на уровне блока, поэтому блоки значительно упрощают настройку данных или директив, общих для задач. Директива не влияет на сам блок, она наследуется только задачами, заключёнными в блок. Например, оператор when применяется к задачам внутри блока, а не к самому блоку.
tasks:
- name: Install, configure, and start Apache
block:
- name: Install httpd and memcached
ansible.builtin.yum:
name:
- httpd
- memcached
state: present
- name: Apply the foo config template
ansible.builtin.template:
src: templates/src.j2
dest: /etc/foo.conf
- name: Start service bar and enable it
ansible.builtin.service:
name: bar
state: started
enabled: True
when: ansible_facts['distribution'] == 'CentOS'
become: true
become_user: root
ignore_errors: yes
В примере выше условие «when» будет оцениваться перед запуском каждой из трёх задач в блоке Ansible. Все три задачи также наследуют директивы повышения привилегий, выполняясь от имени пользователя root. Наконец, ignore_errors: yes гарантирует, что Ansible продолжит выполнение книги задач, даже если некоторые задачи завершатся ошибкой.
Имена для блоков доступны с версии Ansible 2.3. Рекомендуется использовать имена во всех задачах, внутри блоков или где-либо ещё, для лучшей наглядности задач, выполняемых при запуске книги задач.
Обработка ошибок с помощью блоков
Вы можете управлять тем, как Ansible реагирует на ошибки задач, используя блоки с секциями rescue и always.
Блоки rescue указывают задачи для выполнения, когда предыдущая задача в блоке завершится ошибкой. Этот подход аналогичен обработке исключений во многих языках программирования. Ansible выполняет блоки rescue только после того, как задача вернёт состояние «failed». Плохие определения задач и недоступные хосты не будут вызывать блок rescue.
tasks:
- name: Handle the error
block:
- name: Print a message
ansible.builtin.debug:
msg: 'I execute normally'
- name: Force a failure
ansible.builtin.command: /bin/false
- name: Never print this
ansible.builtin.debug:
msg: 'I never execute, due to the above task failing, :-('
rescue:
- name: Print when errors
ansible.builtin.debug:
msg: 'I caught an error, can do stuff here to fix it, :-)'
Вы также можете добавить секцию always в блок. Задачи в секции always выполняются независимо от состояния предыдущего блока.
- name: Always do X
block:
- name: Print a message
ansible.builtin.debug:
msg: 'I execute normally'
- name: Force a failure
ansible.builtin.command: /bin/false
- name: Never print this
ansible.builtin.debug:
msg: 'I never execute :-('
always:
- name: Always do this
ansible.builtin.debug:
msg: "This always executes, :-)"
Вместе эти элементы обеспечивают сложную обработку ошибок.
- name: Attempt and graceful roll back demo
block:
- name: Print a message
ansible.builtin.debug:
msg: 'I execute normally'
- name: Force a failure
ansible.builtin.command: /bin/false
- name: Never print this
ansible.builtin.debug:
msg: 'I never execute, due to the above task failing, :-('
rescue:
- name: Print when errors
ansible.builtin.debug:
msg: 'I caught an error'
- name: Force a failure in middle of recovery! >:-)
ansible.builtin.command: /bin/false
- name: Never print this
ansible.builtin.debug:
msg: 'I also never execute :-('
always:
- name: Always do this
ansible.builtin.debug:
msg: "This always executes"
Задачи в block выполняются в обычном режиме. Если какие-либо задачи в блоке возвращают failed, выполняется секция rescue, содержащая задачи для восстановления от ошибки. Секция always выполняется независимо от результатов секций block и rescue.
Если в блоке произошла ошибка и задача rescue выполнена успешно, Ansible отменяет ошибочное состояние исходной задачи для данного выполнения и продолжает выполнение книги задач, как если бы исходная задача завершилась успешно. Задача rescue считается успешной и не вызывает max_fail_percentage или any_errors_fatal конфигураций. Однако Ansible всё ещё сообщает об ошибке в статистике книги задач.
Вы можете использовать блоки с flush_handlers в задаче rescue, чтобы гарантировать выполнение всех обработчиков, даже если произошла ошибка:
tasks:
- name: Attempt and graceful roll back demo
block:
- name: Print a message
ansible.builtin.debug:
msg: 'I execute normally'
changed_when: yes
notify: run me even after an error
- name: Force a failure
ansible.builtin.command: /bin/false
rescue:
- name: Make sure all handlers run
meta: flush_handlers
handlers:
- name: Run me even after an error
ansible.builtin.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.
См. также
- Введение в книги задач
-
Введение в книги задач
- Роли
-
Организация книги задач по ролям
- Пользовательский список рассылки
-
У вас есть вопросы? Зайдите на группу 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.10/user_guide/playbooks_blocks.html