Menyebarkan folder file templat menggunakan mungkin

47

Apakah ada cara mudah untuk menggunakan folder yang penuh folder .j2 template ke kotak linux, menggunakan nama yang sama dengan template, tetapi tanpa ekstensi .j2, daripada menggunakan modul template untuk setiap file?

Saat ini saya memiliki daftar panjang:

- name: create x template
  template:
    src=files/x.conf.j2
    dest=/tmp/x.conf
    owner=root
    group=root
    mode=0755
  notify:
    - restart myService
Trololololol
sumber

Jawaban:

67

Anda dapat menggunakan with_fileglobuntuk mendapatkan daftar file dari direktori template Anda dan menggunakan 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
Russell
sumber
11
catatan with_fileglobselalu beroperasi dari files/, Anda dapat membuka templat dengan ../templates/mytemplate/*. stackoverflow.com/a/27407566/1695680
ThorSummoner
2
Terima kasih, ini sangat membantu. Saya menemukan bahwa saya harus menggunakan dua garis miring terbalik untuk keluar dari periode literal dalam fungsi regex_replace. Mungkin karena saya memiliki seluruh bagian template dest dalam tanda kutip ganda sehingga saya bisa menggunakan format YAML untuk definisi tugas (yang saya lebih suka daripada format satu-liner).
Tony Cesaro
1
ini mengasumsikan hanya file yang hidup dalam folder template, jika Anda perlu mendukung direktori dan file dalam folder template maka Anda perlu with_filetree - lihat stackoverflow.com/questions/41667864/…
danday74
Catatan yang regex_replaceharus cocok di akhir baris \.j2$untuk kasus di mana pola mungkin ada di dalam nama file.
Brett Ryan
20

Michael DeHaan (pencipta Ansible) membuat posting di CoderWall yang berbicara tentang masalah yang sangat mirip. Anda dapat menyesuaikan dan memperluasnya 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 notifypernyataan. Jika ada tugas yang berubah, layanan akan diberitahukan dengan cara yang persis sama dengan yang harus dinyalakan kembali 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 kita memiliki tugas yang mengambil lebih dari satu argumen unik, kita tidak hanya mengatakan " item" di baris ' template:', tetapi juga menggunakan with_itemsvariabel hash (kamus). Anda juga dapat menyimpannya sedikit lebih pendek dengan menggunakan daftar, jika diinginkan. 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 bisa mendefinisikan daftar Anda berjalan di file lain, seperti file " groupvars/webservers" untuk mendefinisikan semua variabel yang diperlukan untuk webserversgrup, atau file YAML yang dimuat dari varsfilesarahan " " di dalam buku pedoman. Lihat bagaimana ini dapat membersihkan jika kita melakukannya.

- name: template everything for fooserv
  template: src={{item.src}} dest={{item.dest}}
  with_items: {{fooserv_template_files}}
  notify: 
      - restart fooserv
Mxx
sumber
5
Metode yang lebih sederhana adalah menulis template: src=templates/{{item}}.j2 dest=/etc/splat/{{item}}.conf, dan kemudian menggunakan daftar item sederhana:with_items: - foo - bar
Ethan
Ini sebenarnya terlihat salah sekarang. Garis templat yang benar adalah template: src={{item.src}} dest={{item.dest}}(yaitu tidak ${var}tetapi bukan {{var}})
Fabiano Francesconi
@FabianoFrancesconi diperbarui.
Mxx
9

Jawaban oleh Russel berhasil tetapi butuh perbaikan

- name: create x template
- template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('.j2','') }}
- with_fileglob:
   - files/*.j2

Pertama-tama $ harus pergi karena itu salah regex di regex_replace. Kedua, semua file harus berada di direktori file daripada direktori templates

HJ_VORTEX
sumber
4
Selamat Datang di Kesalahan Server! Jawaban Anda menyarankan solusi yang bisa diterapkan untuk pertanyaan tersedia melalui jawaban sebelumnya, sehingga akan lebih sesuai sebagai hasil edit dari jawaban itu. Harap pertimbangkan untuk menghapus jawaban Anda saat ini dan menyarankan edit untuk jawaban Russell.
Paul
7

Saya menulis sebuah plugin pencarian filetree yang dapat membantu dengan tindakan pada pohon file.

Anda dapat berulang pada file dalam pohon file dan berdasarkan properti file melakukan tindakan (misalnya template atau salin). Karena jalur relatif dikembalikan, Anda dapat membuat ulang filetree 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 playbook lebih mudah dibaca.

Dag Wieers
sumber
Itu belum digabungkan :-(
Morgan Christiansson
2
Telah digabung.
Dag Wieers
Apakah ada cara untuk memfilter mengatakan hanya file * .conf?
Andrey
Tentu saja, di bagian "kapan:" Anda dapat menulis ekspresi yang sesuai dengan kebutuhan Anda.
Dag Wieers
1
Pengaya tidak lambat, proses templating dan menyalin setiap file satu per satu yang membuatnya lambat. Tapi itu hampir tidak ada hubungannya dengan plugin, plugin bisa berguna untuk hal lain selain templating atau menyalin.
Dag Wieers
3

Perintah di bawah ini berfungsi bagi saya untuk melakukan pencarian rekursif untuk file j2 dalam template dan memindahkannya ke tujuan. Semoga ini membantu seseorang yang mencari salinan templat rekursif 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') }}"
Robin
sumber
1

Ada kemungkinan untuk mengambil daftar file aktual dari direktori secara otomatis dan mengulanginya setelahnya.

- 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() }}"
Roman Dolejsi
sumber
Perhatikan peringatan standar tentang pemisahan pada baris baru - nama file mungkin mengandung baris baru. Solusi yang lebih aman adalah dengan menggunakan utilitas shell yang mendukung print0, seperti find, dan kemudian dibagi \u0000.
Dejay Clayton