Solution 1 :
Vous pouvez utiliser with_fileglob
pour obtenir la liste des fichiers de votre répertoire de modèles et utiliser des filtres pour supprimer l'extension j2 comme ceci :
- name: create x template
template:
src: "{{ item }}"
dest: /tmp/{{ item | basename | regex_replace('\.j2$', '') }}
with_fileglob:
- ../templates/*.j2
Solution 2 :
Michael DeHaan (créateur d'Ansible) a publié un article sur CoderWall qui parle d'un problème très similaire. Vous pouvez l'ajuster et l'étendre en fonction de vos besoins (tels que les autorisations et la propriété). La partie pertinente du message se trouve ici :
Cela peut être simplifié en utilisant "with_items
" et un seul notify
déclaration. Si l'une des tâches change, le service sera notifié exactement de la même manière qu'il doit redémarrer à la fin de l'exécution du playbook.
- 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
Notez que puisque nous avons des tâches qui prennent plus d'un argument unique, nous ne disons pas simplement "item
" dans le 'template:
', mais utilisez with_items
avec une variable de hachage (dictionnaire). Vous pouvez également le garder un peu plus court en utilisant des listes, si vous le souhaitez. Il s'agit d'une préférence stylistique :
- 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
Bien sûr, nous pourrions également définir la liste que vous parcouriez dans un autre fichier, comme un "groupvars/webservers
" fichier pour définir toutes les variables nécessaires au webservers
groupe, ou un fichier YAML chargé depuis le "varsfiles
" directive dans le playbook. Regardez comment cela peut nettoyer si nous le faisons.
- name: template everything for fooserv
template: src={{item.src}} dest={{item.dest}}
with_items: {{fooserv_template_files}}
notify:
- restart fooserv
Solution 3 :
La réponse de Russel fonctionne mais doit être améliorée
- name: create x template
- template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('.j2','') }}
- with_fileglob:
- files/*.j2
Le premier de tous les $ doit aller car c'était une mauvaise regex dans le regex_replace . Deuxièmement, tous les fichiers doivent se trouver dans le répertoire des fichiers plutôt que dans le répertoire des modèles
Solution 4 :
J'ai écrit un plugin de recherche filetree qui peut aider avec des actions sur les arborescences de fichiers.
- https://github.com/ansible/ansible/pull/14332 (Ansible v2.x)
- https://github.com/ansible/ansible/pull/14628 (Ansible v1.9.x)
Vous pouvez parcourir les fichiers dans une arborescence de fichiers et, en fonction des propriétés du fichier, effectuer des actions (par exemple, modèle ou copie). Puisque le chemin relatif est renvoyé, vous pouvez facilement recréer l'arborescence de fichiers sur le ou les systèmes cibles.
- name: Template complete tree
template:
src: '{{ item.src }}'
dest: /web/{{ item.path }}
force: yes
with_filetree: some/path/
when: item.state == 'file'
Cela rend les playbooks plus lisibles.
Solution 5 :
La commande ci-dessous a fonctionné pour moi pour effectuer une recherche récursive des fichiers j2 dans les modèles et les déplacer vers la destination. J'espère que cela aidera quelqu'un à la recherche d'une copie récursive des modèles vers la destination.
- 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') }}"