2015-11-17 3 views
8

Мне нужно создать один файл с содержимым одного факта в Ansible. В настоящее время я делаю что-то вроде этого:Можно ли использовать встроенные шаблоны?

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

Мой файл шаблона выглядит следующим образом:

{{ git_commit }} 

Очевидно, что это было бы сделать гораздо больше смысла, чтобы просто сделать что-то вроде этого:

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

Кукольный предлагает нечто подобное. Есть ли способ сделать это в Ansible?

ответ

8

Другой вариант для lineinfile модуля (как указано на udondan «s answer) будет использовать copy модуль и определить содержание, а не источник локального хосту анзибль.

Пример задача будет выглядеть примерно так:

- 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 

Это очиститель и он использует модули для того, для чего они предназначены.

+0

является ЦСИ и Dest назад? Я думаю, вы хотите src:/path/to/REVISION, если это ваш шаблон. У ОП есть хороший вопрос. Было бы неплохо перейти непосредственно от встроенного контента без необходимости проходить промежуточный этап. – Greg

4

Да, в этом простом случае это возможно с модулем lineinfile.

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

Модуль lineinfile обычно используется для того, чтобы конкретная строка содержится в файле. Опция create=yes будет содержать файл, если он не существует. Опция regexp=.* гарантирует, что вы не добавите контент в файл, если git_commit изменится, потому что по умолчанию просто убедитесь, что новый контент добавлен в файл и не заменит предыдущий контент.

Это работает только в том случае, если в вашем файле имеется только одна строка. Если бы у вас было больше строк, это явно не сработало бы с этим модулем.

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 
Смежные вопросы