在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
之前有没有人处理此行为?
答案 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
内复制。如果您有一个未定义的变量,则将复制该文件而不使用上述变量块。