Solución:
Las variables en Ansible son globales, por lo que no hay razón para pasar una variable al controlador. Si está tratando de hacer que un controlador esté parametrizado de una manera en la que está tratando de usar una variable en el nombre de un controlador, no podrá hacerlo en Ansible.
Lo que puede hacer es crear un controlador que recorra una lista de servicios con bastante facilidad, aquí hay un ejemplo de trabajo que puede probarse localmente:
- hosts: localhost
tasks:
- file: >
path=/tmp/{{ item }}
state=directory
register: files_created
with_items:
- one
- two
notify: some_handler
handlers:
- name: "some_handler"
shell: "echo {{ item }} has changed!"
when: item.changed
with_items: files_created.results
Finalmente lo resolví dividiendo las aplicaciones en varias instancias del mismo rol. De esta forma, el controlador en el rol puede hacer referencia a las variables que se definen como variable del rol.
En site.yml:
- hosts: localhost
roles:
- role: something
name: a
- role: something
name: b
En roles / algo / tareas / main.yml:
- name: do something
shell: "echo {{ name }}"
notify: something happened
- name: do something else
shell: "echo {{ name }}"
notify: something happened
En roles / algo / manejadores / main.yml:
- name: something happened
debug:
msg: "{{ name }}"
¡Parece mucho menos hackear que la primera solución!
Para actualizar la respuesta de jarv anterior, Ansible 2.5 reemplaza with_items
con loop
. Al obtener resultados, item
por sí solo no funcionará. Deberá obtener explícitamente el nombre, por ejemplo, item.name
.
- hosts: localhost
tasks:
- file: >
path=/tmp/{{ item }}
state=directory
register: files_created
loop:
- one
- two
notify: some_handler
handlers:
- name: "some_handler"
shell: "echo {{ item.name }} has changed!"
when: item.changed
loop: files_created.results