2015-11-17 26 views
8

Ho bisogno di creare un singolo file con il contenuto di un singolo fatto in Ansible. Attualmente sto facendo qualcosa di simile:È possibile utilizzare modelli in linea?

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

mio file di modello si presenta così:

{{ git_commit }} 

Ovviamente, sarebbe rendere molto più senso di fare proprio qualcosa di simile:

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

Puppet offre qualcosa di simile. C'è un modo per farlo in Ansible?

risposta

8

Un'altra opzione per il modulo lineinfile (come dato da udondan s' answer) sarebbe quella di utilizzare il modulo copy e specificare il contenuto piuttosto che una fonte locale per l'host Ansible.

Un compito esempio potrebbe sembrare qualcosa di simile:

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

io personalmente preferisco questo a lineinfile quanto a me lineinfile dovrebbe essere per rendere lievi modifiche ai file che si trovano già lì dove, come copy è di assicurarsi un file è in un posto e sembra esattamente come lo vuoi tu. Ha anche il vantaggio di far fronte a più linee.

In realtà, però sarei tentato di fare di questo un compito modello e solo un file di modello sono:

"{{ git_commit }}" 

che viene creato da questo compito:

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

È più pulito e sta usando i moduli esattamente per cosa sono destinati.

+0

è lo src e dest all'indietro? penso che tu voglia src:/path/to/REVISION se questo è il tuo modello. L'OP ha una buona domanda. Sarebbe bello andare direttamente dal contenuto in linea senza dover passare attraverso un intermediario. – Greg

4

Sì, in questo caso semplice è possibile con il modulo lineinfile.

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

Il modulo lineinfile solito viene utilizzato per garantire che una linea specifica è contenuta all'interno di un file. L'opzione create=yes cancellerà il file se non esiste. L'opzione regexp=.* assicura che non si aggiunga contenuto al file se le modifiche sono git_commit, perché per impostazione predefinita si accerterà semplicemente che il nuovo contenuto sia aggiunto al file e non sostituisca il contenuto precedente.

Questo funziona solo perché nel file è presente solo una riga. Se avessi avuto più linee questo ovviamente non funzionerebbe con questo modulo.

0

Questo problema sembra essere risolto. Tuttavia, se il file di modello è stato più di una variabile, vale a dire un file JSON, è possibile usare il modulo copia con il parametro di contenuti, con una ricerca , cioè .:

# 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 
Problemi correlati