Existe-t-il un moyen facile de déployer un dossier rempli de dossier de modèle .j2 dans une boîte Linux, en utilisant le même nom que le modèle, mais sans l'extension .j2, plutôt que d'utiliser le module de modèle pour chaque fichier?
En ce moment, j'ai une longue liste de:
- name: create x template
template:
src=files/x.conf.j2
dest=/tmp/x.conf
owner=root
group=root
mode=0755
notify:
- restart myService
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
Michael DeHaan (créateur d'Ansible) a fait un post 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 de l'article est ici:
Cela peut être simplifié en utilisant "with_items
"et une seule instruction notify
. Si l'une des tâches change, le service sera averti 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 raccourcir un peu 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 parcourez dans un autre fichier, comme un "groupvars/webservers
"pour définir toutes les variables nécessaires au groupe webservers
, ou un fichier YAML chargé à partir de la directive" varsfiles
"à l'intérieur du playbook. Regardez comment cela peut se 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
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
Tout d'abord, le $ doit être utilisé car il s'agissait d'une expression rationnelle incorrecte dans regex_replace. Deuxièmement, tous les fichiers doivent être dans le répertoire des fichiers plutôt que dans le répertoire des modèles
J'ai écrit un plugin de recherche filetree qui peut aider avec des actions sur les arborescences de fichiers.
Vous pouvez récursivement sur les fichiers dans une arborescence de fichiers et en fonction des propriétés des fichiers effectuer des actions (par exemple, modèle ou copie). Puisque le chemin relatif est retourné, vous pouvez recréer facilement le filetree sur le (s) système (s) cible (s).
- 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.
La commande ci-dessous a fonctionné pour moi pour faire une recherche récursive pour les fichiers j2 dans les modèles et les déplacer vers la destination. J'espère que cela aide 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') }}"
Il est possible de récupérer automatiquement la liste des fichiers réels dans le répertoire et de les réitérer par la suite.
- name: get the list of templates to transfer
local_action: "Shell ls templates/* | sed 's~.*/~~g'"
register: template_files
- name: iterate and send templates
template: src=templates/{{ item }} dest=/mydestination/{{ item }}
with_items:
- "{{ template_files.stdout.splitlines() }}"