Определение
Зачем нужны pre_tasks
, tasks
, roles
, post_tasks
в Ansible?
В общем виде порядок выполнения всегда будет следующий:
1) pre_tasks -> 2) roles -> 3) tasks -> 4) post_tasks
Основные отличия:
pre_tasks
иpost_tasks
нужны для использования вместе с директивойroles
для выполнения тасок до или после ролиroles
иtasks
делят одно пространство и не должны использоваться в одном play согласно best-practice
Однако, есть еще одна важная особенность при работе с handler — в пределах одного play его можно вызвать до 3 раз:
- в
pre_tasks
- в
roles
/tasks
(при использовании вместе, handler будет вызван в конце tasks единожды) - в
post_tasks
Также, здесь важно отметить, что в pre_tasks
и post_tasks
можно вызывать handlers из роли и он, согласно правилу выше, может быть выполнен до 3 раз
Практика
Напишем тестовый плейбук, роль и конфиг со следующей структурой:
├── ansible.cfg
├── roles
│ └── client
│ ├── handlers
│ │ └── main.yml
│ └── tasks
│ └── main.yml
└── test.yml
Содержимое ansible.cfg:
[defaults]
roles_path = roles
stdout_callback = yaml
Содержимое roles/client/handlers/main.yml:
---
- name: Print role message
ansible.builtin.debug:
msg: Role handler executed succesfully
Содержимое roles/client/tasks/main.yml:
---
- name: Send role message
ansible.builtin.command: /bin/true
notify:
- Print message
- Print role message
Содержимое test.yml
---
- name: Testing handlers
hosts: localhost
gather_facts: false
handlers:
- name: Print message
ansible.builtin.debug:
msg: Handler executed succesfully
pre_tasks:
- name: Echo pre tasks
ansible.builtin.command: /bin/true
notify:
- Print message
- Print role message
roles:
- client
tasks:
- name: Echo tasks
ansible.builtin.command: /bin/true
notify:
- Print message
- Print role message
post_tasks:
- name: Post tasks
ansible.builtin.command: /bin/true
notify:
- Print message
- Print role message
Результат выполнения ansible-playbook test.yml
: