2015-10-28 9 views
14

klucz istnieje Mam host_var w ansibla z dict ze wszystkimi interfejsami:Sprawdź, czy w dict w Jinja2 szablonu na ansibla

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

I chcę, aby sprawdzić, czy DICT odgrywa kluczową VLAN1 jeśli ok put do wartości szablonu vlan1.ip jeszcze raz wstawiono 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 %}; 

ale mam błąd:

fatal: [127.0.0.1] => {'msg': "AnsibleUndefinedVariable: One or more undefined variables: 'dict object' has no attribute 'vlan1'", 'failed': True} 

I found że to musi być praca w Jinja2 ale wydaje się, nie działa w ansibla. Może ktoś ma inny sposób na rozwiązanie tego problemu? Po zdefiniowaniu vlan1 działa poprawnie. Answer version 1.9.2

Próbowałem odtworzyć go w python i nie mam błędu, jeśli mój słownik nie ma klucza vlan1. Dzięki @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' 

Odpowiedz

17

Odpowiedź jest prosta i pokazała komunikat o błędzie ansibli. Przede wszystkim muszę sprawdzić, czy zmienna jest zdefiniowana.

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

Ta kombinacja działa dobrze.

+0

wydaje się, że część "jest zdefiniowana" ma kluczowe znaczenie. nie byłem w stanie zrobić logiki 'if' przy użyciu' {% if item.var%} ' –

+0

@RyanTuck {% if item.var%} sprawdza tylko jeśli var nie ma wartości Null i jeśli jest nie zdefiniowany, który powoduje błąd. Jeśli potrzebujesz wszystkich kontroli, użyj go razem {% jeśli zdefiniowano item.var i item.var%} – Alex

6

Najlepszym sposobem na sprawdzenie, czy klucz istnieje w słowniku (w jakimkolwiek kontekście Jinja2, nie tylko z ansibl) jest użycie operatora in, np

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

Dziękuję. Ale mam inny błąd: 'fatal: [127.0.0.1] => {'msg': 'AnsibleUndefinedVariable: Jedna lub więcej niezdefiniowanych zmiennych: obiekt float nie ma elementu 0', 'failed': True}' – Alex

+0

Może 'vlan2' jest również niedostępny? Mogłabym bardziej pomóc, gdybyś mógł opublikować poradnik, który odtwarza konkretny problem. – larsks

+0

host_var, którego możesz zobaczyć. Playbook jest prostą rolą: '- name: Configure named.conf.options template: src = named.conf.options.j2 dest =/etc/bind/named.conf.options backup = yes owner = root group = bind mode = 0644 stają się: tak tagi: bind notify: restart bind' W named.conf.options.j2 używam szablonu jinja, jak opisano powyżej. – Alex

Powiązane problemy