在ansible上检查Jinja2模板中的字典中是否存在键
Check if key exists in a dict in Jinja2 template on ansible
我有一个 host_var ansible with dict 和所有接口:
---
interfaces:
vlan0:
ip: 127.0.0.1
mask: 255.255.255.0
state: true
vlan2:
ip: 127.0.1.1
mask: 255.255.255.0
state: true
我想检查 dict 是否有键 vlan1 如果可以放入模板值 vlan1.ip 否则放入 vlan2.ip.
{% if interfaces.vlan1 %}
# and also I try {% if 'vlan1' in interfaces %}
{{ interfaces.vlan1.ip }};
{% else %}
{{ interfaces.vlan2.ip|default("127.0.0.1") }};
{% endif %};
但是我有一个错误:
fatal: [127.0.0.1] => {'msg': "AnsibleUndefinedVariable: One or more undefined variables: 'dict object' has no attribute 'vlan1'", 'failed': True}
我 它必须在 Jinja2 中工作,但它似乎在 ansible 中不起作用。也许有人有另一种方法来解决这个问题?
当我定义 vlan1 时,它工作正常。 Ansible 版本 1.9.2
我试图在 python 中重现它,如果我的字典没有关键字 vlan1,也没有错误。感谢@GUIDO
>>> from jinja2 import Template
>>> b = Template("""
... {% if interfaces.vlan1 %}
... {{ interfaces.vlan1.ip }}
... {% else %}
... {{ interfaces.vlan2.ip|default("127.0.3.1") }}
... {% endif %}""")
>>> b.render(interfaces={'vlan3':{'ip':'127.0.1.1'},'vlan2':{'ip':'127.0.2.1'}})
u'\n\n127.0.2.1\n'
>>> b.render(interfaces={'vlan1':{'ip':'127.0.1.1'},'vlan2':{'ip':'127.0.2.1'}})
u'\n\n127.0.1.1\n'
检查字典中是否存在键的最佳方法(在任何 Jinja2 上下文中,而不仅仅是 Ansible)是使用 in
运算符,例如:
{% if 'vlan1' in interfaces %}
{{ interfaces.vlan1.ip |default(interfaces.vlan2.ip) }};
{% endif %}
答案很简单,它显示在 ansible 错误消息中。首先,我需要检查是否定义了 var。
{% if interfaces.vlan1 is defined %}
{{ interfaces.vlan1.ip }}
{% else %}
{{ interfaces.vlan2.ip|default("127.0.3.1") }}
{% endif %}
这个组合效果很好。
我有一个 host_var ansible with dict 和所有接口:
---
interfaces:
vlan0:
ip: 127.0.0.1
mask: 255.255.255.0
state: true
vlan2:
ip: 127.0.1.1
mask: 255.255.255.0
state: true
我想检查 dict 是否有键 vlan1 如果可以放入模板值 vlan1.ip 否则放入 vlan2.ip.
{% if interfaces.vlan1 %}
# and also I try {% if 'vlan1' in interfaces %}
{{ interfaces.vlan1.ip }};
{% else %}
{{ interfaces.vlan2.ip|default("127.0.0.1") }};
{% endif %};
但是我有一个错误:
fatal: [127.0.0.1] => {'msg': "AnsibleUndefinedVariable: One or more undefined variables: 'dict object' has no attribute 'vlan1'", 'failed': True}
我
我试图在 python 中重现它,如果我的字典没有关键字 vlan1,也没有错误。感谢@GUIDO
>>> from jinja2 import Template
>>> b = Template("""
... {% if interfaces.vlan1 %}
... {{ interfaces.vlan1.ip }}
... {% else %}
... {{ interfaces.vlan2.ip|default("127.0.3.1") }}
... {% endif %}""")
>>> b.render(interfaces={'vlan3':{'ip':'127.0.1.1'},'vlan2':{'ip':'127.0.2.1'}})
u'\n\n127.0.2.1\n'
>>> b.render(interfaces={'vlan1':{'ip':'127.0.1.1'},'vlan2':{'ip':'127.0.2.1'}})
u'\n\n127.0.1.1\n'
检查字典中是否存在键的最佳方法(在任何 Jinja2 上下文中,而不仅仅是 Ansible)是使用 in
运算符,例如:
{% if 'vlan1' in interfaces %}
{{ interfaces.vlan1.ip |default(interfaces.vlan2.ip) }};
{% endif %}
答案很简单,它显示在 ansible 错误消息中。首先,我需要检查是否定义了 var。
{% if interfaces.vlan1 is defined %}
{{ interfaces.vlan1.ip }}
{% else %}
{{ interfaces.vlan2.ip|default("127.0.3.1") }}
{% endif %}
这个组合效果很好。