Soluzione 1:
Potresti usare with_fileglob
per ottenere l'elenco dei file dalla directory dei modelli e utilizzare i filtri per eliminare l'estensione j2 in questo modo:
- name: create x template
template:
src: "{{ item }}"
dest: /tmp/{{ item | basename | regex_replace('\.j2$', '') }}
with_fileglob:
- ../templates/*.j2
Soluzione 2:
Michael DeHaan (creatore di Ansible) ha pubblicato un post su CoderWall che parla di un problema molto simile. Puoi adattarlo ed espanderlo in base alle tue esigenze (come autorizzazioni e proprietà). La parte rilevante del post è qui:
Questo può essere semplificato usando "with_items
" e un solo notify
dichiarazione. Se una delle attività cambia, il servizio verrà avvisato esattamente nello stesso modo in cui deve essere riavviato al termine dell'esecuzione del 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
Nota che poiché abbiamo compiti che accettano più di un argomento univoco, non diciamo solo "item
" nel 'template:
', ma usa with_items
con una variabile hash (dizionario). Puoi anche mantenerlo un po' più breve usando gli elenchi, se lo desideri. Questa è una preferenza stilistica:
- 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
Ovviamente potremmo anche definire la lista su cui stavi camminando in un altro file, come un "groupvars/webservers
" per definire tutte le variabili necessarie per il webservers
o un file YAML caricato dal file "varsfiles
" direttiva all'interno del playbook. Guarda come questo può ripulire se lo facciamo.
- name: template everything for fooserv
template: src={{item.src}} dest={{item.dest}}
with_items: {{fooserv_template_files}}
notify:
- restart fooserv
Soluzione 3:
La risposta di Russel funziona ma necessita di miglioramenti
- name: create x template
- template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('.j2','') }}
- with_fileglob:
- files/*.j2
Prima di tutto $ deve andare perché era un'espressione regolare sbagliata in regex_replace . In secondo luogo, tutti i file dovrebbero trovarsi nella directory dei file piuttosto che nella directory dei modelli
Soluzione 4:
Ho scritto un plug-in di ricerca filetree che può aiutare con le azioni sui file tree.
- https://github.com/ansible/ansible/pull/14332 (Ansible v2.x)
- https://github.com/ansible/ansible/pull/14628 (Ansible v1.9.x)
È possibile ricorrere ai file in un albero di file e in base alle proprietà del file eseguire azioni (ad esempio modello o copia). Poiché viene restituito il percorso relativo, è possibile ricreare facilmente l'albero dei file sui sistemi di destinazione.
- name: Template complete tree
template:
src: '{{ item.src }}'
dest: /web/{{ item.path }}
force: yes
with_filetree: some/path/
when: item.state == 'file'
Rende i playbook più leggibili.
Soluzione 5:
Il comando seguente ha funzionato per me per eseguire una ricerca ricorsiva dei file j2 nei modelli e spostarlo nella destinazione. Spero che aiuti qualcuno che cerca una copia ricorsiva dei modelli a destinazione.
- 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') }}"