如何使用具有不同变量集的模板模块?

Kes*_*Max 75 ansible ansible-template

我的用例如下:

我有一个模板文件,我想从该模板创建2个不同的文件,变量由每个文件的不同变量集填充.

例如,假设我想模拟包含该行的文件:

mkdir -p {{myTemplateVariable}}
Run Code Online (Sandbox Code Playgroud)

我想找到一个正确的方法来让这个变量填充"File1"和"File2".就像是 :

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


- name: template test 2
  template: 
        src=myTemplateFile
        dest=result2
Run Code Online (Sandbox Code Playgroud)

我可以为第一个模板指定要使用的变量是a ="File1",对于第二个模板,b ="File2".

Kon*_*rov 118

使用Ansible 2.x,您可以使用vars:任务.

模板test.j2:

mkdir -p {{myTemplateVariable}}
Run Code Online (Sandbox Code Playgroud)

剧本:

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

- template: src=test.j2 dest=/tmp/File2
  vars:
    myTemplateVariable: myOtherDir
Run Code Online (Sandbox Code Playgroud)

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

  • 最初我犯了一个错误并且有变量:像其他模板参数一样缩进(比如src :).我想缩进级别意味着变量:是任务,而不是模板.所以你可以在任何地方这样做,而不仅仅是模板.不错. (9认同)

Tec*_*cat 35

你可以很容易地做到这一点,看看我的主管食谱:

- 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

输出:

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'})
Run Code Online (Sandbox Code Playgroud)

请享用!


udo*_*dan 33

不幸的是,template模块不支持向其传递变量,可以在模板中使用.有一个功能请求,但它被拒绝了.

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

1.包括

include语句支持传递变量.因此,您可以将template任务放在一个额外的文件中,并使用适当的参数将其包含两次:

my_include.yml:

- name: template test
  template: 
    src: myTemplateFile
    dest: result1
  vars:
    myTemplateVariable: File1

- name: template test
  template: 
    src: myTemplateFile
    dest: result2
  vars:
    myTemplateVariable: File2
Run Code Online (Sandbox Code Playgroud)

main.yml:

- name: template test
  template: 
        src=myTemplateFile
        dest=destination
Run Code Online (Sandbox Code Playgroud)

2.重新定义myTemplateVariable

另一种方法是在每个template任务之前简单地重新定义myTemplateVariable .

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

- include: my_include.yml destination=result2 myTemplateVariable=File2
Run Code Online (Sandbox Code Playgroud)

  • 不再需要了.现在支持"vars".请参阅下面的@ konstantin-suvorov回答. (14认同)

小智 22

这是我正在使用的解决方案/ hack:

任务/ 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
Run Code Online (Sandbox Code Playgroud)

瓦尔/ main.yml

var_a:
  - 'this is var_a'
var_b:
  - 'this is var_b'
Run Code Online (Sandbox Code Playgroud)

模板/ test.j2:

{{ item }}
Run Code Online (Sandbox Code Playgroud)

运行之后,你进入this is var_a/ tmp/templateA和this is var_b/ 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'
Run Code Online (Sandbox Code Playgroud)

然后在模板中引用它们,如下所示:

{{ item.var_1 }}
{{ item.var_2 }}
Run Code Online (Sandbox Code Playgroud)


小智 7

我是这样做的.

在tasks/main.yml中

- name: template test
  template: 
        src=myTemplateFile.j2
        dest={{item}}
   with_dict: some_dict
Run Code Online (Sandbox Code Playgroud)

并在vars/main.yml中

some_dict:
  /path/to/dest1:
    var1: 1
    var2: 2
  /path/to/dest2:
    var1: 3
    var2: 4
Run Code Online (Sandbox Code Playgroud)

并在templates/myTemplateFile.j2中

some_var = {{ item.value.var1 }}
some_other_var = {{ item.value.var2 }}
Run Code Online (Sandbox Code Playgroud)

希望这能解决你的问题.