2015-11-17 7 views
8

Potrzebuję utworzyć pojedynczy plik z zawartością pojedynczego faktu w Ansible. Jestem obecnie robi coś takiego:Czy można korzystać z szablonów wbudowanych?

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

Mój plik szablon wygląda tak:

{{ git_commit }} 

oczywiście, że to zrobić dużo więcej sensu, aby po prostu zrobić coś takiego:

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

Puppet oferuje coś podobnego. Czy jest jakiś sposób na zrobienie tego w Ansible?

Odpowiedz

8

Inną opcją do modułu lineinfile (podane przez udondan „s answer) byłoby użyć modułu copy i określić zawartość zamiast źródła lokalnego z hostem ansibl.

Przykładem zadaniem będzie wyglądać następująco:

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

ja osobiście wolę to lineinfile jak dla mnie lineinfile powinny być dokonywania niewielkich zmian w plikach, które są już tam, gdzie jako copy jest dla upewniając plik jest w miejscu i wygląda dokładnie tak, jak tego chcesz. Ma także zaletę radzenia sobie z wieloma liniami.

W rzeczywistości jednak chciałbym mieć pokusę, aby to zadanie szablon i po prostu mieć plik szablonu być:

"{{ git_commit }}" 

który zostanie utworzony przez tego zadania:

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

To czystsze i używa modułów do dokładnie tego, do czego są przeznaczone.

+0

jest src i dest wstecz? Myślę, że chcesz src:/path/to/REVISION, jeśli to jest twój szablon. PO ma dobre pytanie. Byłoby miło przejść bezpośrednio z treści liniowych bez konieczności przechodzenia przez półprodukt. – Greg

4

Tak, w tym prostym przypadku jest to możliwe z modułem lineinfile.

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

Moduł lineinfile zwykle używany jest w celu zapewnienia, że ​​specjalna linia jest zawarty wewnątrz pliku. Opcja create=yes utworzy plik, jeśli nie istnieje. Opcja regexp=.* zapewnia, że ​​nie dodasz zawartości do pliku, jeśli zmieni się git_commit, ponieważ domyślnie po prostu upewnia się, że nowa zawartość zostanie dodana do pliku, a nie zastąpi poprzedniej zawartości.

Działa to tylko dlatego, że masz tylko jeden wiersz w swoim pliku. Gdybyś miał więcej linii, to oczywiście nie działałoby z tym modułem.

0

Ten problem wydaje się być rozwiązany. Jednakże, jeśli plik szablonu było więcej niż jedną zmienną, czyli pliku json, możliwe jest użycie modułu kopiowania zawartości z parametrem, z odnośnika, tj .:

# 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