Solución 1:
Podrías usar with_fileglob
para obtener la lista de archivos de su directorio de plantillas y usar filtros para eliminar la extensión j2 de esta manera:
- name: create x template
template:
src: "{{ item }}"
dest: /tmp/{{ item | basename | regex_replace('\.j2$', '') }}
with_fileglob:
- ../templates/*.j2
Solución 2:
Michael DeHaan (creador de Ansible) hizo una publicación en CoderWall que habla de un problema muy similar. Puede ajustarlo y expandirlo según sus necesidades (como permisos y propiedad). La parte relevante de la publicación está aquí:
Esto se puede simplificar usando "with_items
" y un solo notify
declaración. Si alguna de las tareas cambia, se notificará al servicio exactamente de la misma manera que debe reiniciarse al final de la ejecución del libro de jugadas.
- name: template everything for fooserv
template: src={{item.src}} dest={{item.dest}}
with_items:
- { src: 'templates/foo.j2', dest: '/etc/splat/foo.conf' }
- { src: 'templates/bar.j2', dest: '/etc/splat/bar.conf' }
notify:
- restart fooserv
Tenga en cuenta que dado que tenemos tareas que toman más de un argumento único, no decimos simplemente "item
" en el 'template:
' línea, pero usa with_items
con una variable hash (diccionario). También puede mantenerlo un poco más corto usando listas, si lo desea. Esta es una preferencia estilística:
- name: template everything for fooserv
template: src={{item.0}} dest={{item.1}}
with_items:
- [ 'templates/foo.j2', '/etc/splat/foo.conf' ]
- [ 'templates/bar.j2', '/etc/splat/bar.conf' ]
notify:
- restart fooserv
Por supuesto, también podríamos definir la lista por la que caminaba en otro archivo, como "groupvars/webservers
" archivo para definir todas las variables necesarias para el webservers
grupo, o un archivo YAML cargado desde el "varsfiles
" directiva dentro del libro de jugadas. Mire cómo esto puede limpiarse si lo hacemos.
- name: template everything for fooserv
template: src={{item.src}} dest={{item.dest}}
with_items: {{fooserv_template_files}}
notify:
- restart fooserv
Solución 3:
La respuesta de Russel funciona pero necesita mejoras
- name: create x template
- template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('.j2','') }}
- with_fileglob:
- files/*.j2
En primer lugar, todo el $ debe desaparecer, ya que era una expresión regular incorrecta en regex_replace. En segundo lugar, todos los archivos deben estar en el directorio de archivos en lugar del directorio de plantillas
Solución 4:
Escribí un complemento de búsqueda de árbol de archivos que puede ayudar con acciones en árboles de archivos.
- https://github.com/ansible/ansible/pull/14332 (Ansible v2.x)
- https://github.com/ansible/ansible/pull/14628 (Ansible v1.9.x)
Puede recurrir a los archivos en un árbol de archivos y, según las propiedades del archivo, realizar acciones (por ejemplo, plantilla o copia). Dado que se devuelve la ruta relativa, puede volver a crear el árbol de archivos en los sistemas de destino con facilidad.
- name: Template complete tree
template:
src: '{{ item.src }}'
dest: /web/{{ item.path }}
force: yes
with_filetree: some/path/
when: item.state == 'file'
Hace que los libros de jugadas sean más legibles.
Solución 5:
El siguiente comando me funcionó para hacer una búsqueda recursiva de archivos j2 en plantillas y moverlo al destino. Espero que ayude a alguien que busca una copia recursiva de las plantillas en el destino.
- name: Copying the templated jinja2 files
template: src={{item}} dest={{RUN_TIME}}/{{ item | regex_replace(role_path+'/templates','') | regex_replace('\.j2', '') }}
with_items: "{{ lookup('pipe','find {{role_path}}/templates -type f').split('\n') }}"