Как избежать временного файла при использовании jinja2 в ansible

#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».