ansible 2:不能在模板

时间:2017-02-22 09:42:17

标签: ansible jinja2

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

template.yml:

{{ var1 }}{{ var2 }}{{ var3 }}

如果未定义任何这些变量,则不会替换任何变量。因此,您可以根据需要在您的剧本中指明其中一些变量,而不是其他变量。

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

E.g:

剧本:

- hosts: myhost
   vars:
     var1=1
     var3=3
   roles:
     - myrole

任务:

- name: copy template
  become: true
  template: src=test.j2 dest=/tmp/test owner=user group=user

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

13

和ansible 2.2.0.0是

{{ var1 }}{{ var2 }}{{ var3 }}

所以,没有任何变种被替换。

但是如果:

剧本:

- hosts: myhost
   vars:
     var1=1
     var2=2
     var3=3
   roles:
     - myrole

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

123

之前有没有人处理此行为?

2 个答案:

答案 0 :(得分:1)

有一些Jinja过滤器可用于在未定义变量时提供帮助。

您可以尝试使用default过滤器来设置未定义的值

{{ var1 }}{{ var2 | default(None) }}{{ var3 }}

如果未定义变量2,这会将var2设置为""。这就是我处理大多数变量的方式,这些变量可能不需要为正在运行的特定主机定义。

您还可以使用omit Jinja过滤器进行测试,该过滤器将忽略该变量的使用。

{{ var1 }}{{ var2 | default(omit) }}{{ var3 }}

有关Jinja过滤器的完整列表,请参见https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html

答案 1 :(得分:0)

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

{% if var1 is defined and var2 is defined and var3 is defined %}
        {{ var1 }}{{ var2 }}{{ var3 }}
{% endif %}

如果您定义了所有三个变量,则模板将在123内复制。如果您有一个未定义的变量,则将复制该文件而不使用上述变量块。