Lösung 1:
Sie könnten with_fileglob
verwenden um die Liste der Dateien aus Ihrem Vorlagenverzeichnis abzurufen und Filter zu verwenden, um die j2-Erweiterung wie folgt zu entfernen:
- name: create x template
template:
src: "{{ item }}"
dest: /tmp/{{ item | basename | regex_replace('\.j2$', '') }}
with_fileglob:
- ../templates/*.j2
Lösung 2:
Michael DeHaan (Schöpfer von Ansible) hat einen Beitrag auf CoderWall erstellt, in dem es um ein sehr ähnliches Problem geht. Sie können es an Ihre Bedürfnisse anpassen und erweitern (z. B. Berechtigungen und Eigentum). Relevanter Teil des Beitrags ist hier:
Dies kann vereinfacht werden, indem Sie "with_items
verwenden " und ein einzelnes notify
Aussage. Wenn sich eine der Aufgaben ändert, wird der Dienst auf genau die gleiche Weise benachrichtigt, dass er am Ende der Playbook-Ausführung neu gestartet werden muss.
- 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
Beachten Sie, dass wir, da wir Aufgaben haben, die mehr als ein eindeutiges Argument benötigen, nicht einfach "item
" sagen " im 'template:
' Zeile, aber verwenden Sie with_items
mit einer Hash-(Wörterbuch-)Variablen. Sie können es auch etwas kürzer halten, indem Sie Listen verwenden, wenn Sie möchten. Dies ist eine stilistische Präferenz:
- 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
Natürlich könnten wir die Liste, über die Sie gelaufen sind, auch in einer anderen Datei definieren, wie eine "groupvars/webservers
"-Datei, um alle Variablen zu definieren, die für webservers
benötigt werden Gruppe oder eine YAML-Datei, die aus der Datei „varsfiles
"-Anweisung im Playbook. Schauen Sie, wie das aufräumen kann, wenn wir das tun.
- name: template everything for fooserv
template: src={{item.src}} dest={{item.dest}}
with_items: {{fooserv_template_files}}
notify:
- restart fooserv
Lösung 3:
Die Antwort von Russel funktioniert, muss aber verbessert werden
- name: create x template
- template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('.j2','') }}
- with_fileglob:
- files/*.j2
Zunächst einmal muss das $ gehen, da es in regex_replace ein falscher Regex war. Zweitens sollten sich alle Dateien im Dateiverzeichnis und nicht im Vorlagenverzeichnis
befindenLösung 4:
Ich habe ein Filetree-Lookup-Plugin geschrieben, das bei Aktionen auf Dateibäumen helfen kann.
- https://github.com/ansible/ansible/pull/14332 (Ansible v2.x)
- https://github.com/ansible/ansible/pull/14628 (Ansible v1.9.x)
Sie können Dateien in einem Dateibaum rekursiv durchlaufen und basierend auf Dateieigenschaften Aktionen ausführen (z. B. Vorlage oder Kopieren). Da der relative Pfad zurückgegeben wird, können Sie den Dateibaum problemlos auf dem/den Zielsystem(en) neu erstellen.
- name: Template complete tree
template:
src: '{{ item.src }}'
dest: /web/{{ item.path }}
force: yes
with_filetree: some/path/
when: item.state == 'file'
Es sorgt für besser lesbare Playbooks.
Lösung 5:
Der folgende Befehl hat bei mir funktioniert, um eine rekursive Suche nach j2-Dateien in Vorlagen durchzuführen und sie an das Ziel zu verschieben. Hoffe, es hilft jemandem, der nach einer rekursiven Kopie von Vorlagen zum Ziel sucht.
- 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') }}"