Estoy usando un libro de jugadas ansible para configurar Apache para una lista de sitios. El libro de jugadas debe copiar la plantilla de configuración de host virtual para cada sitio en su lugar y luego habilitar cada sitio usando a2ensite
:
- name: Install apache site conf
template: src=apache-sites-{{item}}-conf.j2 dest=/etc/apache2/sites-available/{{item}}.conf mode=0644
with_items:
- sitea
- siteb
- sitec
- sited
- name: Enable site apache conf
command: a2ensite {{item}}
args:
creates: /etc/apache2/sites-enabled/{{item}}.conf
with_items:
- sitea
- siteb
- sitec
- sited
No me gusta tener que repetir la misma lista para cada tarea. ¿Cómo configuro el libro de jugadas para ejecutar ambas tareas con la misma lista de elementos?
loop
en unablock
cuadra. Eso parece ser solicitado, pero rechazado a través de Ansible GH número 13262 .:-(
Encontré una solución usando archivos glob. Como tengo un archivo de configuración para cada sitio, simplemente puedo usar la lista de esos archivos para iterar sobre todos ellos. De esa manera, no tengo la lista de sitios en mi archivo de tareas ni una sola vez, y mucho menos dos veces. Todo lo que necesito hacer para agregar un sitio es agregar un archivo.
Para facilitar un poco las cosas, creé un directorio para las plantillas:
roles/webserver/templates/apache-sites/sitea.conf.j2
roles/webserver/templates/apache-sites/siteb.conf.j2
roles/webserver/templates/apache-sites/sitec.conf.j2
roles/webserver/templates/apache-sites/sited.conf.j2
Luego en
roles/webserver/tasks/main.yml
puedo usar esa lista de archivos y algunas expresiones regulares:Esta técnica incluso podría usarse con archivos ficticios vacíos para crear una lista para otras aplicaciones.
fuente
Konstantin dio una buena respuesta; Aquí hay un sabor adicional.
Normalmente definiré las listas como variables y simplemente escribiré dos bucles separados sobre la misma variable:
Esto funciona muy bien con precedencia variable , por ejemplo, definiendo diferentes conjuntos de servidores por entorno. También funciona cuando necesita realizar varias otras tareas no en bucle entre los dos bucles.
fuente