繁体   English   中英

检查ansible中Jinja2模板中的dict中是否存在键

[英]Check if key exists in a dict in Jinja2 template on ansible

我有一个带有所有接口的dict的ans_ host_var:

---
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 else put 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'

答案很简单,它显示了ansible错误消息。 首先,我需要检查是否定义了var。

{% if interfaces.vlan1 is defined %}
{{ interfaces.vlan1.ip }}
{% else %}
{{ interfaces.vlan2.ip|default("127.0.3.1") }}
{% endif %}

这种组合效果很好。

检查字典中是否存在密钥的最佳方法(在任何Jinja2上下文中,而不仅仅是Ansible)是使用in运算符,例如:

{% if 'vlan1' in interfaces %}
{{ interfaces.vlan1.ip |default(interfaces.vlan2.ip) }};
{% endif %}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM