#ansible #jinja2 #ansible-template
Вопрос:
Я хочу сделать довольно простую вещь в ansible, которая:
- Сгенерируйте файл, используя шаблон jinja2, с дополнительной переменной, переданной в мой playbook
- Используйте сгенерированный файл в качестве параметра командной строки, но я бы хотел избежать создания какого-либо временного файла. Смотрите ниже пример с созданием временного файла (пример 1) и один без временного файла (пример 2).
Мой вопрос таков: есть ли более приятный способ (кратчайший путь, например, только для одной задачи) написать сборник пьес в соответствии с примером 2 без использования временного файла?
Заранее спасибо.
Пример 1: использование временного файла
Вот пример из множества попыток, которые я предпринял:
---
- hosts: localhost
gather_facts: false
any_errors_fatal: true
################################################################
# Mandatory --extra-vars #
# myvar : My variable #
# ##############################################################
vars:
myvar: "{{ myvar }}"
tasks:
- name: Create temporary file
tempfile:
state: file
prefix: ansible
suffix: mysuffix
register: my_temp_file
- name: Generate file from template replacing my_var by its value in dest file
template:
src: ./templates/mytemplate.j2
dest: "{{ my_temp_file.path }}"
- name: use file generated with jinja2
shell: |
cat "{{ my_temp_file.path }}" | ./mycommand -f -
- name: Use the registered var and the file module to remove the temporary file
file:
path: "{{ my_temp_file.path }}"
state: absent
when: my_temp_file.path is defined
Пример 2: без временного файла
---
- hosts: localhost
gather_facts: false
any_errors_fatal: true
################################################################
# Mandatory --extra-vars #
# myvar : My variable #
# ##############################################################
vars:
myvar: "{{ myvar }}"
tasks:
- name: get output of templating engine when applied on template
set_fact:
rendered_template: "{{ lookup('template', './templates/mytemplate.j2') }}"
- name: use file generated with jinja2
shell: |
cat <<< "{{ rendered_template }}" | ./mycommand -f -
Ответ №1:
Используйте stdin, например
- name: Use stdin generated by Jinja2
command:
cmd: ./mycommand -f -
stdin: "{{ lookup('template', 'templates/mytemplate.j2') }}"
Тогда вы также можете использовать command вместо shell. Цитирование из Заметок:
«Если вы хотите выполнить команду надежно и предсказуемо, возможно, лучше вместо этого использовать модуль ansible.builtin.command».