ansible 2:不能在模板中使用undef vars

jlb*_*oot 6 jinja2 ansible

在ansible 1.9我有一些角色,我可以在模板中使用未定义的变量(ansible.cfg中的error_on_undefined_vars = False),但没有问题:

template.yml:

{{ var1 }}{{ var2 }}{{ var3 }}
Run Code Online (Sandbox Code Playgroud)

如果没有定义任何这些变量,则不代之.因此,您可以根据需要在您的剧本中指出其中一些变量而不是其他变量.

但是我在升级到ansible 2.2.0.0后发现,如果没有定义任何这些变量,则不会替换任何模板的变量,结果模板为:{{var1}} {{var2}} {{var3} }

例如:

剧本:

- hosts: myhost
   vars:
     var1=1
     var3=3
   roles:
     - myrole
Run Code Online (Sandbox Code Playgroud)

任务:

- name: copy template
  become: true
  template: src=test.j2 dest=/tmp/test owner=user group=user
Run Code Online (Sandbox Code Playgroud)

运行此playbook后,使用ansible 1.9运行的结果/ tmp/test运行

13
Run Code Online (Sandbox Code Playgroud)

和ansible 2.2.0.0是

{{ var1 }}{{ var2 }}{{ var3 }}
Run Code Online (Sandbox Code Playgroud)

所以,没有变量被替换.

但如果:

剧本:

- hosts: myhost
   vars:
     var1=1
     var2=2
     var3=3
   roles:
     - myrole
Run Code Online (Sandbox Code Playgroud)

运行此playbook后,使用ansible 1.9/2.2.0.0生成的/ tmp/test运行

123
Run Code Online (Sandbox Code Playgroud)

有没有人以前处理这种行为?

13d*_*tar 1

您可以做的事情之一是将变量放入条件检查中,无论它是否已定义。或者放置变量块,如果您需要定义所有变量才能设置。您的模板应如下所示:

{% if var1 is defined and var2 is defined and var3 is defined %}
        {{ var1 }}{{ var2 }}{{ var3 }}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

如果定义了所有三个变量,模板将被复制到123内部。即使有一个未定义的变量,也会在没有上述变量块的情况下复制该文件。