Solusi 1:
Anda bisa menggunakan with_fileglob
untuk mendapatkan daftar file dari direktori template Anda dan gunakan filter untuk menghapus ekstensi j2 seperti ini:
- name: create x template
template:
src: "{{ item }}"
dest: /tmp/{{ item | basename | regex_replace('\.j2$', '') }}
with_fileglob:
- ../templates/*.j2
Solusi 2:
Michael DeHaan (pembuat Ansible) membuat postingan di CoderWall yang membicarakan masalah yang sangat mirip. Anda dapat menyesuaikan dan mengembangkannya sesuai dengan kebutuhan Anda (seperti izin dan kepemilikan). Bagian yang relevan dari pos ada di sini:
Ini dapat disederhanakan dengan menggunakan "with_items
" dan satu notify
penyataan. Jika ada tugas yang berubah, layanan akan diberi tahu dengan cara yang persis sama seperti yang diperlukan untuk memulai ulang di akhir proses 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
Perhatikan bahwa karena kami memiliki tugas yang membutuhkan lebih dari satu argumen unik, kami tidak hanya mengatakan "item
" di 'template:
' baris, tetapi gunakan with_items
dengan variabel hash (kamus). Anda juga dapat membuatnya sedikit lebih pendek dengan menggunakan daftar, jika Anda suka. Ini adalah preferensi gaya:
- 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
Tentu saja kami juga dapat menentukan daftar yang Anda telusuri di file lain, seperti file "groupvars/webservers
" untuk mendefinisikan semua variabel yang diperlukan untuk webservers
grup, atau file YAML yang dimuat dari file "varsfiles
" di dalam playbook. Lihat bagaimana ini bisa dibersihkan jika kita melakukannya.
- name: template everything for fooserv
template: src={{item.src}} dest={{item.dest}}
with_items: {{fooserv_template_files}}
notify:
- restart fooserv
Solusi 3:
Jawaban oleh Russel memang berhasil tetapi perlu perbaikan
- name: create x template
- template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('.j2','') }}
- with_fileglob:
- files/*.j2
Pertama-tama $ harus pergi karena regex salah di regex_replace . Kedua, semua file harus berada di direktori files daripada direktori template
Solusi 4:
Saya menulis plugin pencarian filetree yang dapat membantu tindakan pada hierarki file.
- https://github.com/ansible/ansible/pull/14332 (Kemungkinan v2.x)
- https://github.com/ansible/ansible/pull/14628 (Kemungkinan v1.9.x)
Anda dapat mengulangi file di pohon file dan berdasarkan properti file melakukan tindakan (mis. Template atau salin). Karena jalur relatif dikembalikan, Anda dapat membuat ulang pohon file pada sistem target dengan mudah.
- name: Template complete tree
template:
src: '{{ item.src }}'
dest: /web/{{ item.path }}
force: yes
with_filetree: some/path/
when: item.state == 'file'
Itu membuat buku pedoman lebih mudah dibaca.
Solusi 5:
Perintah di bawah ini berhasil bagi saya untuk melakukan pencarian rekursif untuk file j2 di template dan memindahkannya ke tujuan. Semoga ini membantu seseorang yang mencari salinan rekursif template ke tujuan.
- 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') }}"