2015-11-17 21 views
8

Ich muss eine einzige Datei mit dem Inhalt einer einzelnen Tatsache in Ansible erstellen. Ich bin derzeit so etwas wie dies zu tun:Ist es möglich, Inline-Vorlagen zu verwenden?

- template: src=templates/git_commit.j2 dest=/path/to/REVISION 

Meine Template-Datei wie folgt aussieht:

{{ git_commit }} 

Offensichtlich würde es viel mehr Sinn machen, nur etwas tun, wie folgt aus:

- inline_template: content={{ git_revision }} dest=/path/to/REVISION 

Marionette bietet etwas ähnliches. Gibt es einen Weg, dies in Ansible zu tun?

Antwort

8

Eine weitere Option zum lineinfile Modul (wie answer von udondan ‚s gegeben) wären das copy Modul zu verwenden und den Inhalt anstatt eine Quelle lokal auf das ansible Host angeben.

Ein Beispiel Aufgabe würde in etwa so aussehen:

- name: Copy commit ref to file 
    copy: 
    content: "{{ git_commit }}" 
    dest: /path/to/REVISION 

ich dies persönlich für mich lineinfile bevorzugen lineinfile für die Herstellung von leichten Änderungen an Dateien sein sollte, die schon da sind, wo als copy ist für dafür, dass eine Datei ist an einem Ort und sieht genau so aus wie du es willst. Es hat auch den Vorteil, mit mehreren Linien fertig zu werden.

In Wirklichkeit, obwohl ich dies eine Vorlage Aufgabe zu machen versucht sein würde und haben nur die Template-Datei sein:

"{{ git_commit }}" 

, die von dieser Aufgabe erstellt wird:

- name: Copy commit ref to file 
    template: 
    src: path/to/template 
    dest: /path/to/REVISION 

Es ist sauberer und es verwendet Module für genau das, wofür sie bestimmt sind.

+0

ist die src und dest nach hinten zu bedienen? Ich denke du willst src:/pfad/zu/REVISION wenn das deine Vorlage ist. Das OP hat eine gute Frage. Es wäre schön, direkt von Inline-Inhalten zu gehen, ohne ein Zwischenprodukt durchlaufen zu müssen. – Greg

4

Ja, in diesem einfachen Fall ist es mit dem lineinfile Modul möglich.

- lineinfile: 
    dest=/path/to/REVISION 
    line="{{ git_commit }}" 
    regexp=".*" 
    create=yes 

Die in der Regel lineinfile Modul wird verwendet in einer Datei enthalten sind, um sicherzustellen, dass eine bestimmte Zeile. Die create=yes Option wird die Datei erstellen, wenn sie nicht existiert. Die Option regexp=.* stellt sicher, dass Sie der Datei keinen Inhalt hinzufügen, wenn sich git_commit ändert, da sie standardmäßig sicherstellen würde, dass der neue Inhalt zur Datei hinzugefügt wird und nicht den vorherigen Inhalt ersetzt.

Dies funktioniert nur, da Sie nur eine Zeile in Ihrer Datei haben. Hätten Sie mehr Zeilen gehabt, würde das mit diesem Modul natürlich nicht funktionieren.

0

Dieses Problem scheint gelöst zu sein. Wenn jedoch die Template-Datei mehr als eine Variable ist, das heißt, eine JSON-Datei ist es möglich, Kopiermodul mit Inhaltsparameter, mit einem Lookup, d.h .:

# playbook.yml 
--- 
- name: deploy inline template 
    copy: 
    content: '{{ lookup("template", "inlinetemplate.yml.j2") }}' 
    dest: /var/tmp/inlinetempl.yml 

# inlinetemplate.yml.j2 
--- 
- name: {{ somevar }} 
    abc: def 
Verwandte Themen