Frage Bereitstellen eines Ordners mit Vorlagendateien unter Verwendung von ansible


Gibt es eine einfache Möglichkeit, einen Ordner mit einem .j2-Ordner für die Vorlage in einer Linux-Box bereitzustellen, wobei derselbe Name wie für die Vorlage, jedoch ohne die Erweiterung .j2 verwendet wird, 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

40
2018-02-26 21:36


Ursprung




Antworten:


Du könntest benutzen with_fileglob Um die Liste der Dateien aus Ihrem Vorlagenverzeichnis zu erhalten 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

55
2017-10-28 05:08



Hinweis with_fileglob funktioniert immer von files/, können Sie Vorlagen mit bekommen ../templates/mytemplate/*. stackoverflow.com/a/27407566/1695680 - ThorSummoner
Danke, das ist super hilfreich. Ich fand heraus, dass ich zwei umgekehrte Schrägstriche verwenden musste, um der literalen Periode in der regex_replace-Funktion zu entkommen. Vielleicht, weil ich den gesamten Ziel-Template-Teil in Anführungszeichen gesetzt hatte, damit ich das YAML-Format für die Aufgabendefinition verwenden konnte (was ich lieber über das Einzeiler-Format bevorzuge). - Tony Cesaro
Dies setzt voraus, dass nur Dateien innerhalb des Templates-Ordners liegen, wenn Sie sowohl Verzeichnisse als auch Dateien im Templates-Ordner unterstützen müssen, dann benötigen Sie with_filetree - see stackoverflow.com/questions/41667864/... - danday74
Ein Hinweis, dass regex_replace sollte am Zeilenende übereinstimmen \.j2$ für Fälle, in denen das Muster innerhalb des Dateinamens existieren kann. - Brett Ryan


Michael DeHaan (Schöpfer von Ansible) hat einen Kommentar hinterlassen CoderWall das spricht von einem sehr ähnlichen Thema. Sie können sie entsprechend Ihren Anforderungen anpassen und erweitern (z. B. Berechtigungen und Eigentumsrechte). Relevanter Teil der Post ist hier:


Dies kann vereinfacht werden, indem "with_items"Und eine einzige notify Aussage. Wenn sich eine der Aufgaben ändert, wird der Service genau so 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 einziges Argument benötigen, nicht nur sagen "item" in dem 'template:Linie, aber benutzen with_items mit einer Hash (Wörterbuch) Variable. 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 auch die Liste, in der Sie gerade waren, in einer anderen Datei definieren, z. B. "groupvars/webservers"Datei, um alle Variablen zu definieren, die für die webservers Gruppe oder eine YAML-Datei, die von der "varsfiles"Anweisung im Spielbuch. Schauen Sie, wie das aufräumen kann, wenn wir es tun.

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

18
2018-03-04 04:04



Eine einfachere Methode könnte das Schreiben sein template: src=templates/{{item}}.j2 dest=/etc/splat/{{item}}.confund dann eine einfache Liste von Elementen verwenden: with_items: - foo - bar - Ethan
Das sieht jetzt eigentlich falsch aus. Die richtige Vorlagenzeile wäre template: src={{item.src}} dest={{item.dest}} (d. h. nicht ${var} aber eher {{var}}) - Fabiano Francesconi
@FabianoFrancesconi aktualisiert. - Mxx


Die Antwort von Russel funktioniert, aber es muss verbessert werden

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

Die Ersten von all den $ müssen gehen, da es im regex_replace eine falsche Regex war. Zweitens sollten sich alle Dateien im Dateiverzeichnis und nicht im Vorlagenverzeichnis befinden


9
2018-01-16 16:47



Willkommen bei Serverfehler! Ihre Antwort schlägt vor, dass eine praktikable Lösung für die Frage durch eine vorherige Antwort verfügbar ist, daher wäre sie als Editierung dieser Antwort geeigneter. Bitte bedenken Sie, dass Sie Ihre aktuelle Antwort löschen und eine Änderung zu Russells Antwort vorschlagen möchten. - Paul


Ich habe ein Filetree-Lookup-Plugin geschrieben, das bei Aktionen auf Dateibäumen helfen kann.

Sie können Dateien in einer Dateistruktur rekursiv aufrufen und basierend auf Dateieigenschaften Aktionen ausführen (z. B. Vorlage oder Kopie). Da der relative Pfad zurückgegeben wird, können Sie den Dateibaum auf dem / den Zielsystem (en) mit Leichtigkeit 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 macht lesbarere Playbooks.


5
2018-03-04 10:35



Es wurde noch nicht zusammengeführt :-( - Morgan Christiansson
Es wurde zusammengeführt. - Dag Wieers
Gibt es eine Möglichkeit, nur * .conf-Dateien zu filtern? - Andrey
Sicher, im Teil "Wenn:" können Sie einen Ausdruck schreiben, der Ihren Bedürfnissen entspricht. - Dag Wieers
Das Plugin ist nicht langsam, es ist der Prozess des Templatens und Kopierens jeder einzelnen Datei, die es langsam macht. Aber das hat mit dem Plugin kaum etwas zu tun, das Plugin könnte für andere Dinge als Templaten oder Kopieren nützlich sein. - Dag Wieers


Der folgende Befehl hat mir geholfen, eine rekursive Suche nach j2-Dateien in Vorlagen durchzuführen und sie zum Ziel zu verschieben. Ich hoffe, es hilft jemandem, der nach rekursiver 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') }}"

2
2017-12-15 15:25





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

- 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
2017-07-31 16:07



Beachten Sie den Standard-Vorbehalt zum Aufteilen auf Newline - Dateinamen können Zeilenumbrüche enthalten. Eine sicherere Lösung ist die Verwendung eines unterstützenden Shell-Dienstprogramms print0, sowie findund dann aufteilen \u0000. - Dejay Clayton