GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bereitstellen eines Ordners mit Vorlagendateien mit Ansible

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

befinden

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

Linux
  1. Ansible Guide:Verwalten Sie Dateien mit Ansible

  2. Virtuelle Multipass-Maschinen mithilfe von Ansible

  3. Alle Dateien in einem Ordner drucken?

  4. Wie sortiert man Dateien nach ihren Berechtigungen mit Ls?

  5. Sortieren Sie Dateien in einem bestimmten Ordner mit Ranger?

So benennen Sie Dateien über die Befehlszeile in Linux um

Ansible Inventar- und Konfigurationsdateien

Finden Sie Text in Dateien unter Linux mit grep

So verschieben Sie Dateien mit dem Dateimanager in einen anderen Ordner

Übertragen Sie Dateien mit WinSCP

Verwenden von Bash Sort zum Sortieren von Dateien wie ein Boss