roles with pre_tasks and post_task

I have a patch locally that enables pre and post processing for roles. The directory names are pre_tasks and post_tasks, of course. The flow is:

- hosts: targets
   roles:
    - role-1
    - role-2
   pre_tasks:
    - name: one
   tasks:
    - name: two
   post_tasks:
    - name: three

and evaluates as:

role-1:pre_tasks
role-2:pre_tasks
play:pre_tasks
role-1:tasks
role-2:tasks
play:tasks
role-1:post_tasks
role-2:post_tasks
play:post-tasks

I use it to have a role nginx-frontend, then then wants to know about ofbiz-backend and php-backend, and other hosts that then have those roles. I then have the backend role notify a handler, that then updates /etc/hosts with the address found in $hostvars.

I'm wondering if this makes sense to anyone else, and if it would be wanted? I haven't yet modified docsite, because I'm asking here first.

The following examples show a complex backend registration system; I hit some snags with ordering, so I added the pre/post support for roles, which should allow the main-line tasks to then query for the list of backend mappings. I haven't yet modified my backend role(shown below) with this new feature.

== examples:playbook.yml

- hosts: targets
   accelerate: true
   gather_facts: true
   roles:
     - etckeeper
     - { role: nginx-frontend, when: "inventory_hostname in (groups['frontend'] | default())" }
     - { role: php-backend, when: "inventory_hostname in (groups['php-backend'] | default())" }
     - { role: mysql-backend, when: "inventory_hostname in (groups['mysql-backend'] | default())" }
     - { role: postgresql-backend, when: "inventory_hostname in (groups['postgresql-backend'] | default())" }
     - { role: ofbiz-backend, when: "inventory_hostname in (groups['ofbiz-backend'] | default())" }
     - { role: image-processor, when: "inventory_hostname in (groups['image-processor'] | default())" }

== examples: nginx-frontend/meta.yml

dependencies:
  - role: backend
    tags: ['nginx']
    args:
     role: nginx-frontend
     roles: ['ofbiz-backend', 'php-backend']

== examples: php-backend/meta.yml

dependencies:
  - role: backend
    tags: ['php']
    args:
     role: php-backend
     roles: ['mysql-backend']

== examples: backend/tasks.yml

- set_fact:
     host_roles: "{{host_roles is defined and (host_roles.append(args.role) or host_roles) or [args.role]}}"
   when: args.roles is defined
- set_fact:
     wanted_roles: "{{wanted_roles is defined and (wanted_roles.extend(args.roles) or wanted_roles) or args.roles}}"
   notify:
     - roles-scan {{ args.role }}

== examples: backend/handlers.yml

- name: roles-scan {{ args.role }}
   when: item[1] in wanted_roles
   lineinfile:
    dest=/etc/hosts
    regexp='^\S+\s+.*?{{item[1]}}.universe'
    line='{{item[0].ansible_eth0.ipv4.address}} {{item[1]}}.universe'
   notify:
    - etckeeper commit
   register: roles_scan_result
   with_subelements:
    - hostvars.values() | selectattr('host_roles', 'defined') | list
    - 'host_roles'

Hi Adam,

I suggest taking this to the developer list for further discussion. Features and ideas are regularly discussed there with the Ansible team.

https://groups.google.com/forum/#!forum/ansible-devel

Oh, oops, my bad, I wasn't aware there was a -dev list.