是否可以使用内联模板?

时间:2015-11-17 22:57:33

标签: ansible

我需要在Ansible中创建一个包含单个事实内容的文件。我现在正在做这样的事情:

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

我的模板文件如下所示:

{{ git_commit }}

显然,做这样的事情会更有意义:

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

Puppet提供类似的东西。有没有办法在Ansible中做到这一点?

4 个答案:

答案 0 :(得分:12)

lineinfile模块的另一个选项(由udondananswer提供)将使用copy模块并指定内容而不是本地源致Ansible主持人。

示例任务看起来像:

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

我个人更喜欢这个lineinfile,因为对我而言lineinfile应该对已经存在的文件进行细微更改,因为copy用于确保文件位于某个位置并且看起来就像你想要的那样。它还具有应对多行的好处。

实际上虽然我很想把它作为模板任务,只需要一个模板文件:

"{{ git_commit }}"

由此任务创建的内容:

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

它更干净,它正在使用模块来完全符合它们的意图。

答案 1 :(得分:4)

是的,在这种简单的情况下,可以使用lineinfile模块。

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

lineinfile模块通常用于确保文件中包含特定行。如果文件不存在,create=yes选项将创建文件。 regexp=.*选项可确保在git_commit更改时不向文件添加内容,因为默认情况下只需确保将新内容添加到文件中,而不是替换以前的内容。

这只适用于您的文件中只有一行。如果你有更多的线,这显然不适用于这个模块。

答案 2 :(得分:1)

如果需要将模板插入现有文件,则可以通过lineinfile模块插入。

- name: Insert jinja2 template to the file
  lineinfile:
    path: /path/file.conf
    insertafter: "after this line"
    line: "{{ lookup('template', 'template.conf.j2') }}"

答案 3 :(得分:0)

此问题似乎已得到解决。但是,如果模板文件是多个变量,即json文件,则可以使用带有内容参数的复制模块,使用查找,即:

# 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