Ansible kullanarak bir şablon dosya klasörü dağıtma


47

Her dosya için şablon modülünü kullanmak yerine, şablonla aynı adı kullanarak, ancak .j2 uzantısı olmadan şablon .j2 klasörüyle dolu bir klasörü bir linux kutusuna dağıtmak için kolay bir yol var mı?

Şu anda uzun bir liste var:

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

Yanıtlar:


67

Sen kullanabilirsiniz with_fileglobşablonunuzu dizinden dosyaların listesini almak ve bunun gibi j2 uzantısını şerit filtreleri kullanmak ..

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

11
Not with_fileglobher zaman çalışır files/, şablonlara ulaşabilirsiniz ../templates/mytemplate/*. stackoverflow.com/a/27407566/1695680
ThorSummoner

2
Teşekkürler, bu süper yardımcı oldu. Regex_replace işlevinde değişmez dönemden kaçmak için iki ters eğik çizgi kullanmak zorunda kaldığımı öğrendim. Belki de tüm dest şablon bölümünü çift tırnak içine aldığımdan, görev tanımı için YAML formatını kullanabildiğim için (tek satırlık formatı tercih ederim).
Tony Cesaro

1
Bu sadece varsayar şablonları o zaman with_filetree gerek klasörüne şablonlarda hem dizinleri ve dosyaları desteklemek için gerekirse, klasörü içindeki canlı dosyaları - bkz stackoverflow.com/questions/41667864/...
danday74

Desenin dosya adının içinde bulunabileceği durumlar için regex_replacesatırın sonunda eşleşmesi gereken bir not \.j2$.
Brett Ryan

20

Michael DeHaan ( Ansible'ın yaratıcısı), CoderWall'da çok benzer bir konuda konuşan bir yazı yaptı . Gereksinimlerinize göre (izinler ve mülkiyet gibi) ayarlayabilir ve genişletebilirsiniz. Gönderinin ilgili kısmı burada:


Bu, " with_items" ve tek bir notifyifade kullanarak basitleştirilebilir . Görevlerden herhangi biri değişirse, hizmete, oyun kitabı çalıştırmasının sonunda yeniden başlatılması gerektiği şekilde bildirilir.

 - 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

Birden fazla benzersiz argüman alan görevlere sahip olduğumuz için item, ' template:' satırında sadece " " değil with_items, bir karma (sözlük) değişkeni ile kullandığımızı unutmayın. İsterseniz listeleri kullanarak da biraz daha kısa tutabilirsiniz. Bu bir stilistik tercihtir:

 - 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

Elbette, üzerinde yürüdüğünüz listeyi groupvars/webservers, webserversgrup için gereken tüm değişkenleri tanımlayan bir " " dosyası veya varsfilesoyun kitabının içindeki " " direktifinden yüklenen bir YAML dosyası gibi tanımlayabiliriz . Bakarsak bunun nasıl temizlenebileceğine bir bak.

- name: template everything for fooserv
  template: src={{item.src}} dest={{item.dest}}
  with_items: {{fooserv_template_files}}
  notify: 
      - restart fooserv

5
Daha basit bir yöntem yazmak template: src=templates/{{item}}.j2 dest=/etc/splat/{{item}}.confve ardından düz bir öğe listesi kullanmak olabilir :with_items: - foo - bar
Ethan

Bu aslında şimdi yanlış görünüyor. Doğru şablon hattı olacaktı template: src={{item.src}} dest={{item.dest}}(yani değil ${var}daha ziyade {{var}})
Fabiano Francesconi

@FabianoFrancesconi güncellendi.
Mxx

9

Russel'in cevabı işe yarıyor ama iyileştirilmesi gerekiyor

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

Regex_replace içinde yanlış regex olduğu gibi tüm $ $ firs gitmek gerekiyor. İkincisi, tüm dosyalar, şablonlar dizini yerine dosyalar dizininde olmalıdır.


4
Sunucu Arızasına Hoşgeldiniz! Cevabınız, soruya uygulanabilir bir çözümün önceki bir cevaptan ulaşılabileceğini, dolayısıyla cevabın bir düzenlemesi olarak daha uygun olacağını ileri sürüyor. Lütfen mevcut cevabınızı silmeyi ve Russell'ın cevabına bir düzenleme önermeyi düşünün.
Paul

7

Dosya ağaçlarındaki işlemlerde yardımcı olabilecek bir dosya tabanlı arama eklentisi yazdım.

Bir dosya ağacındaki dosyalar üzerinde yinelenebilir ve dosya özelliklerine göre işlemler gerçekleştirebilirsiniz (örneğin, şablon veya kopya). Göreceli yol döndürüldüğü için, hedef sistem (ler) deki dosya filosunu kolaylıkla yeniden oluşturabilirsiniz.

- name: Template complete tree
  template:
    src: '{{ item.src }}'
    dest: /web/{{ item.path }}
    force: yes
  with_filetree: some/path/
  when: item.state == 'file'

Daha okunabilir oyun kitapları için yapar.


Henüz birleştirilmedi :-(
Morgan Christiansson

2
Birleştirildi.
Dag Wieers

Söylemek için yalnızca * .conf dosyaları süzmenin bir yolu var mı?
Andrey,

Elbette, "zaman:" bölümünde, ihtiyacınıza uygun bir ifade yazabilirsiniz.
Dag Wieers

1
Eklenti yavaş değil, yavaş yavaş her dosyayı ayrı ayrı biçimlendirme ve kopyalama işlemi. Ancak bu eklenti ile ilgisi yoktur, eklenti baştan çıkarmak veya kopyalamaktan başka şeyler için de yararlı olabilir.
Dag Wieers

3

Aşağıdaki komut, şablonlardaki j2 dosyalarını tekrarlayan bir arama yapmam ve hedefe taşımamı sağladı. Umarız hedeflere şablonların özyinelemeli bir kopyasını arayan biri yardımcı olur.

     - 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') }}"

1

Dizindeki gerçek dosyaların listesini otomatik olarak alma ve bunları daha sonra yineleme imkanı vardır.

- 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() }}"

Newline'da bölme ile ilgili standart uyarıya dikkat edin - dosya isimleri yeni satırlar içerebilir. Daha güvenli bir çözelti, taşıyıcıların bir kabuk programı kullanmaktır print0gibi, findve daha sonra bölme \u0000.
Dejay Clayton
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.