如何使用不同的variables集模板模块?

我的用例如下:

我有一个模板文件,我想从该模板创build2个不同的文件,variables由每个文件的一组不同的variables填充。

例如,可以说我想模板包含该行的文件:

mkdir -p {{myTemplateVariable}} 

我想find一个正确的方法来获得这个variables填充“文件1”和“文件2”。 就像是 :

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

我可以在第一个模板中指定要使用的variables是a =“File1”,第二个是b =“File2”。

不幸的是, template模块不支持传递给它的variables,它可以在模板中使用。 有一个function请求,但被拒绝。

我可以想到两个解决方法:

1.包括

include语句支持传递variables。 所以你可以把你的template任务放在一个额外的文件中,并用适当的参数包含它两次:

my_include.yml:

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

main.yml:

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

2.重新定义myTemplateVariable

另一种方法是在每个template任务之前重新定义myTemplateVariable。

 - 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: with tasks。

模板test.j2

 mkdir -p {{myTemplateVariable}} 

剧本:

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

这会将不同的myTemplateVariable值传递给test.j2。

这是我使用的解决scheme/黑客:

任务/ main.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 

瓦尔/ main.yml

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

模板/ test.j2:

 {{ item }} 

运行这个之后,你会得到this is var_a / tmp / templateA this is var_bthis is var_b / tmp / templateB中的this is var_b

基本上,你滥用with_items呈现在一个项目列表中的每个项目的模板。 这是with_items因为您可以控制使用with_items时的列表。

这个缺点是你必须在你的模板中使用item作为variables名称。

如果你想通过这种方式传递多个variables,你可以像这样的列表项来判断:

 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 }} 

你可以很容易地做到这一点,看看我的主pipe配方:

 - 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 

job.conf.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'}) 

请享用!

我是这样做的。

在tasks / 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 

并在templates / 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 

重要提示:请注意,一个项目不一定只是一个string,它可以是一个具有任意数量属性的对象,这样就可以传递任意数量的variables。

在模板中我有:

 <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>