Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to use inline templates?

Tags:

I need to create a single file with the contents of a single fact in Ansible. I'm currently doing something like this:

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

My template file looks like this:

{{ git_commit }}

Obviously, it'd make a lot more sense to just do something like this:

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

Puppet offers something similar. Is there a way to do this in Ansible?

like image 664
Naftuli Kay Avatar asked Nov 17 '15 22:11

Naftuli Kay


People also ask

Can a template function be inline?

Yes, you need the inline specifier there. The ODR (one-definition rule) states that there must be exactly one definition of a variable, function, class, enum or template.

Do templates need to be inline?

So in summary: For non fully specialized function templates, i.e. ones that carry at least one unknown type, you can omit inline , and not receive errors, but still they are not inline . For full specializations, i.e. ones that use only known types, you cannot omit it.

What does template <> mean in C++?

What Does Template Mean? A template is a C++ programming feature that permits function and class operations with generic types, which allows functionality with different data types without rewriting entire code blocks for each type.


2 Answers

Another option to the lineinfile module (as given by udondan's answer) would be to use the copy module and specify the content rather than a source local to the Ansible host.

An example task would look something like:

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

I personally prefer this to lineinfile as for me lineinfile should be for making slight changes to files that are already there where as copy is for making sure a file is in a place and looking exactly like you want it to. It also has the benefit of coping with multiple lines.

In reality though I'd be tempted to make this a template task and just have a the template file be:

"{{ git_commit }}"

Which gets created by this task:

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

It's cleaner and it's using modules for exactly what they are meant for.

like image 113
ydaetskcoR Avatar answered Nov 23 '22 06:11

ydaetskcoR


Yes, in that simple case it is possible with the lineinfile module.

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

The lineinfile module usually is used to ensure that a specific line is contained inside a file. The create=yes option will crete the file if it does not exist. The regexp=.* option makes sure you do not add content to the file if git_commit changes, because it would by default simply make sure the new content is added to the file and not replace the previous content.

This only works since you only have one line in your file. If you'd had more lines this obviously would not work with this module.

like image 24
udondan Avatar answered Nov 23 '22 06:11

udondan