Определение

Зачем нужны 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 раз:

  1. в pre_tasks
  2. в roles/tasks (при использовании вместе, handler будет вызван в конце tasks единожды)
  3. в 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: Ansible_Tasks