Как использовать модуль шаблона с различным набором переменных?
мой вариант использования следующий:
у меня есть файл шаблона, и я хотел бы создать 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 ответов:
к сожалению
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 }}"