2015-10-28 2 views
14

にJinja2のテンプレートで辞書に存在する場合、私はすべてのインターフェイスを持つ辞書とansibleでhost_varを持ってチェックイン:キーがansible

--- 
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のはOK置けば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の中に作業する必要があることfoundが、ansibleでは動作しませんようです。多分、誰かがこの問題を解決する別の方法を持っているでしょうか? vlan1と定義すると問題なく動作します。対応バージョン1.9.2

私はPythonでそれを再現しようとしていましたが、私の辞書にキーがない場合はvlan1です。キーは(任意のJinja2のコンテキスト内だけでなく、Ansible付き)辞書に存在するかどうかを確認するための最良の方法はin演算子を使用することです

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

答えて

17

答えは簡単で、エラーメッセージが表示されます。まず、varが定義されているかどうかを確認する必要があります。

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

この組み合わせはうまくいきます。

+0

「定義されている」部分が重要だと思われます。私は、 ''使用して論理if'作業を行うことができなかった{%がitem.var%であれば} ' –

+0

@RyanTuckザ{%item.var%IFが} varがNULLでない場合にのみチェックし、それがある場合エラーが発生すると定義されていません。あなたはすべてのチェックが一緒にそれを使用する必要がある場合は、{%item.varは定義されており、item.var%されている場合} – Alex

6

を@GUIDOのおかげで、例えば:

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

ありがとうございます。 '致命的な::[127.0.0.1] => { 'MSG': 'AnsibleUndefinedVariable:1つ以上の未定義の変数は:フロートオブジェクトが要素0を持っていない'、 '失敗':真}' – Alex

+0

たぶん 'vlan2'しかし、私は別のエラーを持っています利用できませんか?私はあなたが特定の問題を再現する演劇誌を投稿できるなら、もっと助けることができます。 – larsks

+0

host_varをご覧ください。設定named.conf.options テンプレート::SRC = named.conf.options.j2 DEST =の/ etc /バインド/ named.conf.optionsバックアップ= yesの所有者= rootグループ=バインドモード= - 名前 ':脚本は、単純な役割であります0644 になる:はい タグ:バインドは は通知:上記のようにnamed.conf.options.j2で再起動bind' iは神社のテンプレートを使用しています。 – Alex