Řešení 1:
Můžete použít with_fileglob
získat seznam souborů z adresáře šablon a pomocí filtrů odstranit rozšíření j2 takto:
- name: create x template
template:
src: "{{ item }}"
dest: /tmp/{{ item | basename | regex_replace('\.j2$', '') }}
with_fileglob:
- ../templates/*.j2
Řešení 2:
Michael DeHaan (tvůrce Ansible) zveřejnil příspěvek na CoderWall, který hovoří o velmi podobném problému. Můžete jej upravit a rozšířit podle svých potřeb (jako jsou oprávnění a vlastnictví). Relevantní část příspěvku je zde:
To lze zjednodušit pomocí "with_items
“ a jeden notify
tvrzení. Pokud se některá z úloh změní, služba bude upozorněna přesně stejným způsobem, jakým je třeba ji restartovat na konci spuštění playbooku.
- 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
Všimněte si, že protože máme úlohy, které mají více než jeden jedinečný argument, neříkáme jen "item
“ v 'template:
', ale použijte with_items
s proměnnou hash (slovník). Pokud chcete, můžete jej také ponechat o něco kratší pomocí seznamů. Toto je stylistická preference:
- 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
Samozřejmě bychom mohli také definovat seznam, přes který jste procházeli, v jiném souboru, například "groupvars/webservers
" k definování všech proměnných potřebných pro webservers
nebo soubor YAML načtený z "varsfiles
"" uvnitř příručky. Podívejte se, jak to může vyčistit, pokud to uděláme.
- name: template everything for fooserv
template: src={{item.src}} dest={{item.dest}}
with_items: {{fooserv_template_files}}
notify:
- restart fooserv
Řešení 3:
Odpověď Russela funguje, ale potřebuje zlepšení
- name: create x template
- template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('.j2','') }}
- with_fileglob:
- files/*.j2
Nejprve musí $ odejít, protože v regex_replace byl nesprávný regulární výraz. Za druhé, všechny soubory by měly být v adresáři souborů spíše než v adresáři šablon
Řešení 4:
Napsal jsem plugin pro vyhledávání ve filetree, který může pomoci s akcemi na stromech souborů.
- https://github.com/ansible/ansible/pull/14332 (Ansible v2.x)
- https://github.com/ansible/ansible/pull/14628 (Ansible v1.9.x)
Přes soubory ve stromové struktuře souborů můžete procházet a na základě vlastností souboru provádět akce (např. šablona nebo kopírování). Protože je vrácena relativní cesta, můžete snadno znovu vytvořit strom souborů na cílovém systému (systémech).
- name: Template complete tree
template:
src: '{{ item.src }}'
dest: /web/{{ item.path }}
force: yes
with_filetree: some/path/
when: item.state == 'file'
Díky tomu jsou příručky čitelnější.
Řešení 5:
Níže uvedený příkaz mi pomohl provést rekurzivní vyhledávání souborů j2 v šablonách a přesunout je do cíle. Doufám, že to pomůže někomu, kdo hledá rekurzivní kopie šablon do cíle.
- 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') }}"