Как использовать модуль шаблона с различным набором переменных?


мой вариант использования следующий:

у меня есть файл шаблона, и я хотел бы создать 2 разных файла из этого шаблона, с переменными, заполняемыми различным набором переменных для каждого файла.

например, допустим, я хочу создать шаблон файла, содержащего строку:

mkdir -p {{myTemplateVariable}}

Я хотел бы найти правильный способ, чтобы получить эту переменную, заполненную "File1" и "File2". Что-то вроде :

- name: template test 1
  template: 
        src=myTemplateFile
        dest=result1


- name: template test 2
  template: 
        src=myTemplateFile
        dest=result2

где я мог бы указать для первого шаблона, что переменная для использования является a = " File1 "и для Второго, b = "File2".

7 55

7 ответов:

к сожалению template модуль не поддерживает передачу ему переменных, которые могут быть использованы внутри шаблона. Было!--8-->запрос но он был отклонен.

Я могу придумать два обходных пути:

1. Включить

The include оператор поддерживает передачу переменных. Так что вы могли бы иметь свой template задача внутри дополнительного файла и включить его дважды с соответствующим параметры:

my_include.yml:

- name: template test
  template: 
        src=myTemplateFile
        dest=destination

главная.yml:

- include: my_include.yml destination=result1 myTemplateVariable=File1

- include: my_include.yml destination=result2 myTemplateVariable=File2

2. Переопределите myTemplateVariable

другим способом было бы просто переопределить myTemplateVariable прямо перед каждым template задач.

- set_fact:
     myTemplateVariable: File1

- name: template test 1
  template: 
        src=myTemplateFile
        dest=result1

- set_fact:
     myTemplateVariable: File2

- name: template test 2
  template: 
        src=myTemplateFile
        dest=result2

С Ansible 2.X вы можете использовать vars: задачи.

шаблон test.j2:

mkdir -p {{myTemplateVariable}}

Playbook:

- template: src=test.j2 dest=/tmp/File1
  vars:
    myTemplateVariable: myDirName

- template: src=test.j2 dest=/tmp/File2
  vars:
    myTemplateVariable: myOtherDir

это пройдет по-разному myTemplateVariable значения в тест.в J2.

вы можете сделать это очень легко, посмотрите мой Супервизор рецепт:

- name: Setup Supervisor jobs files
  template:
    src: job.conf.j2
    dest: "/etc/supervisor/conf.d/{{ item.job }}.conf"
    owner: root
    group: root
    force: yes
    mode: 0644
  with_items:
    - { job: bender, arguments: "-m 64", instances: 3 }
    - { job: mailer, arguments: "-m 1024", instances: 2 }
  notify: Ensure Supervisor is restarted

работа.конф.J2 в:

[program:{{ item.job }}]
user=vagrant
command=/usr/share/nginx/vhosts/parclick.com/app/console rabbitmq:consumer {{ item.arguments }} {{ item.job }} -e prod
process_name=%(program_name)s_%(process_num)02d
numprocs={{ item.instances }}
autostart=true
autorestart=true
stderr_logfile=/var/log/supervisor/{{ item.job }}.stderr.log
stdout_logfile=/var/log/supervisor/{{ item.job }}.stdout.log

выход:

TASK [Supervisor : Setup Supervisor jobs files] ********************************
changed: [loc.parclick.com] => (item={u'instances': 3, u'job': u'bender', u'arguments': u'-m 64'})
changed: [loc.parclick.com] => (item={u'instances': 2, u'job': u'mailer', u'arguments': u'-m 1024'})

наслаждайтесь!

это решение / Хак я использую:

задачи/главная.yml:

- name: parametrized template - a
  template:
    src: test.j2
    dest: /tmp/templateA
  with_items: var_a

- name: parametrized template - b
  template:
    src: test.j2
    dest: /tmp/templateB
  with_items: var_b

vars / main.в формате YML

var_a:
  - 'this is var_a'
var_b:
  - 'this is var_b'

шаблоны/тест.J2 в:

{{ item }}

после запуска этого, вы получите this is var_a в /tmp/templateA и this is var_b in/tmp / templateB.

в основном вы злоупотребляете with_items чтобы отобразить шаблон с каждым элементом в списке из одного элемента. Это работает, потому что вы можете контролировать, что список при использовании with_items.

в недостатком этого является то, что вы должны использовать item как имя переменной в шаблоне.

если вы хотите передать более одной переменной таким образом, вы можете диктовать в качестве элементов списка, как это:

var_a:
  -
    var_1: 'this is var_a1'
    var_2: 'this is var_a2'
var_b:
  -
    var_1: 'this is var_b1'
    var_2: 'this is var_b2'

а затем обратитесь к ним в своем шаблоне следующим образом:

{{ item.var_1 }}
{{ item.var_2 }}

Я сделал это таким образом.

в задачах / main.в формате YML

- name: template test
  template: 
        src=myTemplateFile.j2
        dest={{item}}
   with_dict: some_dict

и в vars / main.в формате YML

some_dict:
  /path/to/dest1:
    var1: 1
    var2: 2
  /path/to/dest2:
    var1: 3
    var2: 4

и в шаблонах / myTemplateFile.в J2

some_var = {{ item.value.var1 }}
some_other_var = {{ item.value.var2 }}

надеюсь, что это решит вашу проблему.

- name: copy vhosts
  template: src=site-vhost.conf dest=/etc/apache2/sites-enabled/{{ item }}.conf
  with_items:
    - somehost.local
    - otherhost.local
  notify: restart apache

важно: обратите внимание, что элемент не должен быть просто строкой, это может быть объект с таким количеством свойств, как вам нравится, так что таким образом вы можете передать любое количество переменных.

в шаблоне у меня есть:

<VirtualHost *:80>
    ServerAdmin me@example.org
    ServerName {{ item }}
    DocumentRoot /vagrant/public


    ErrorLog ${APACHE_LOG_DIR}/error-{{ item }}.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

у меня была аналогичная проблема для решения, вот простое решение о том, как передавать переменные в файлы шаблонов, трюк состоит в том, чтобы написать файл шаблона, используя переменную. Вам нужно создать словарь (список также возможен), который содержит набор переменных, соответствующих каждому файлу. Затем в файле шаблона получить к ним доступ.

см. ниже:

the template file: test_file.j2
# {{ ansible_managed }} created by xbalaji@gmail.com

{% set dkey  = (item | splitext)[0]  %}
{% set fname = test_vars[dkey].name  %}
{% set fip   = test_vars[dkey].ip    %}
{% set fport = test_vars[dkey].port  %}
filename: {{ fname }}
ip address: {{ fip }}
port: {{ fport }}

playbook

---
#
# file: template_test.yml
# author: xbalaji@gmail.com
#
# description: playbook to demonstrate passing variables to template files
#
# this playbook will create 3 files from a single template, with different
# variables passed for each of the invocation
#
# usage:
# ansible-playbook -i "localhost," template_test.yml

- name: template variables testing
  hosts: all
  gather_facts: false

  vars:
    ansible_connection: local
    dest_dir: "/tmp/ansible_template_test/"
    test_files:
      - file_01.txt
      - file_02.txt
      - file_03.txt
    test_vars:
      file_01:
        name: file_01.txt
        ip: 10.0.0.1
        port: 8001
      file_02:
        name: file_02.txt
        ip: 10.0.0.2
        port: 8002
      file_03:
        name: file_03.txt
        ip: 10.0.0.3
        port: 8003

  tasks:
    - name: copy the files
      template:
        src: test_file.j2
        dest: "{{ dest_dir }}/{{ item }}"
      with_items:
        - "{{ test_files }}"