it-swarm.com.de

Bereitstellen eines Ordners mit Vorlagendateien mit ansible

Gibt es eine einfache Möglichkeit, einen Ordner mit einem .j2-Vorlagenordner unter demselben Namen wie die Vorlage, jedoch ohne die Erweiterung .j2, auf einer Linux-Box bereitzustellen, anstatt das Vorlagenmodul für jede Datei zu verwenden?

Im Moment habe ich eine lange Liste von:

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

Du könntest benutzen with_fileglob, um die Liste der Dateien aus Ihrem Vorlagenverzeichnis abzurufen und die j2-Erweiterung mithilfe von Filtern wie folgt zu entfernen:

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

Michael DeHaan (Schöpfer von Ansible) hat einen Beitrag auf CoderWall verfasst, in dem es um ein sehr ähnliches Thema geht. Sie können es an Ihre Bedürfnisse anpassen und erweitern (z. B. Berechtigungen und Eigentümer). Relevanter Teil des Beitrags ist hier:


Dies kann durch Verwendung von "with_items "und eine einzelne notify -Anweisung. Wenn sich eine der Aufgaben ändert, wird der Dienst genauso benachrichtigt, wie er am Ende des Playbook-Laufs 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 annehmen, nicht einfach "item" in 'template: 'Zeile, aber benutze with_items mit einer Hash-Variable (Wörterbuch). 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önnen wir die Liste, über die Sie gegangen sind, auch in einer anderen Datei definieren, z. B. "groupvars/webservers "Datei, um alle Variablen zu definieren, die für die Gruppe webservers benötigt werden, oder eine YAML-Datei, die aus der Direktive" varsfiles "im Playbook geladen wurde. Schauen Sie, wie dies aufgeräumt werden kann, wenn wir dies tun.

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

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

Tannen aller $ müssen gehen, da es falscher Regex im regex_replace war. Zweitens sollten sich alle Dateien im Dateiverzeichnis und nicht im Vorlagenverzeichnis befinden

9
HJ_VORTEX

Ich habe ein Filetree-Lookup-Plugin geschrieben, das bei Aktionen für Dateibäume helfen kann.

Sie können Dateien in einem Dateibaum erneut verwenden und basierend auf den Dateieigenschaften Aktionen ausführen (z. B. Vorlage oder Kopie). Da der relative Pfad zurückgegeben wird, können Sie den Dateibaum auf den Zielsystemen problemlos 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 Spielbücher.

8
Dag Wieers

Mit dem folgenden Befehl konnte ich eine rekursive Suche nach j2-Dateien in Vorlagen durchführen und an das Ziel verschieben. Hoffe, es hilft jemandem, der nach einer rekursiven Kopie der 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') }}"
3
Robin

Es besteht die Möglichkeit, die Liste der tatsächlichen Dateien automatisch aus dem Verzeichnis abzurufen und anschließend zu wiederholen.

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