2016-06-10 12 views
6

Ich versuche, ein Wörterbuch durch eine ansible Vorlage Schleife jinja2 unter Verwendung einer Anzahl von Datenquellen zu erstellen, aber diesen Fehler [{'msg': "AnsibleUndefinedVariable: One or more undefined variables: 'dict object' has no attribute 'value'", 'failed': True}]}Loop-Wörterbuch in ansible Vorlage

erhalten, wenn eine Debug-Task ausgeführt es die richtigen Werte tut wieder so Ich habe das Gefühl, dass mein Problem in der Vorlage selbst liegt, aber ich konnte nicht herausfinden, was ich falsch mache.

ansible Aufgabe

- name: debug dictionary 
    debug: msg="{{ item.value.db_url }}" 
    with_dict: databases 

- name: copy tomcat config files 
    template: src="{{ item.src }}" dest="{{ item.dest }}" 
    with_items: 
    - { src: 'context.xml.j2', dest: '/opt/tomcat/conf/context.xml'} 
    notify: restart tomcat 
    with_dict: databases 

ansible Wörterbuch

databases: 
    db1: 
    db_resource: jdbc/db1 
    db_maxidle: 50 
    db_maxconn: 350 
    db_maxwait: 10000 
    db_user: dbuser 
    db_pass: "{{ dbpass }}" 
    db_url: jdbc:postgresql://server:5432/dbname 
    db_driver: org.postgresql.Driver 

Jinja2 Vorlage

{% for items in databases %} 
    <resource name="{{ item.value.db_resource }}" auth="container" type="javax.sql.datasource" maxtotal="{{ item.value.db_maxconn }}" maxidle="{{ item.value.db_maxidle }}" maxwaitmillis="{{ item.value.db_maxwait }}" username="{{ item.value.db_user }}" password="{{ item.value.db_pass }}" driverclassname="{{ item.value.db_driver }}" url="{{ item.value.db_url }}" /> 
{% endfor %} 

Debug Output

ok: [IP] => (item={'key': 'db1', 'value': {'db_maxwait': 10000, 'db_maxconn': 350, 'db_maxidle': 50, 'db_driver': 'org.postgresql.Driver', 'db_pass': u'REDACTED', 'db_resource': 'jdbc/db1', 'db_user': 'dbuser', 'db_url': 'jdbc:postgresql://server:5432/dbname'}}) => { 
    "item": { 
     "key": "db1", 
     "value": { 
      "db_driver": "org.postgresql.Driver", 
      "db_maxconn": 350, 
      "db_maxidle": 50, 
      "db_maxwait": 10000, 
      "db_pass": "REDACTED", 
      "db_resource": "jdbc/db1", 
      "db_url": "jdbc:postgresql://server:5432/db", 
      "db_user": "dbuser" 
     } 
    }, 
    "msg": "jdbc:postgresql://server:5432/dbname" 
} 
+0

Warum benutzt Ihre zweite Aufgabe sowohl 'with_items' als auch' with_dict', vor allem, wenn letzteres nicht verwendet wird? Ich wäre sehr überrascht, wenn das tatsächlich funktioniert hätte. – jwodder

+0

Hmm ursprünglich hatte ich mehrere Dateien in dieser Aufgabe mit den with_items. Ich habe es entfernt, aber immer noch in demselben Problem. Es macht Sinn, sie zu trennen, danke. – tweeks200

Antwort

3

Sie Ihr Ziel, indem Sie Ihre jinja2 Vorlage und Aufgabe wie dies erreichen kann:

Jinja2 Vorlage:

<resource name="{{ databases[item].db_resource }}" auth="container" type="javax.sql.datasource" maxtotal="{{ databases[item].db_maxconn }}" maxidle="{{ databases[item].db_maxidle }}" maxwaitmillis="{{ databases[item].db_maxwait }}" username="{{ databases[item].db_user }}" password="{{ databases[item].db_pass }}" driverclassname="{{ databases[item].db_driver }}" url="{{ databases[item].db_url }}" /> 

ansible Aufgaben:

- name: debug dictionary 
    debug: msg="{{ databases[item].db_url }}" 
    with_items: "{{ databases | list }}" 

- name: copy tomcat config files 
    template: src="{{ item.src }}" dest="{{ item.dest }}" 
    with_items: 
    - { src: 'context.xml.j2', dest: '/opt/tomcat/conf/context.xml'} 
    notify: restart tomcat 
    with_items: "{{ databases | list }}" 

Hoffnung, dass vielleicht Ihnen helfen, bitte passen Sie Ihre Aufgaben nach Ihrer Anforderung

+0

Das funktioniert perfekt, danke! – tweeks200

6

In Jinja, wenn databases ein Wörterbuch ist, for items in databases wird (wie in Python) iteriert über die Tasten des Wörterbuchs, nicht seine Schlüssel/Wert-Paare. Daher sollte in Ihrer Vorlage item.value (von dem ich annehme, dass es items.value sein soll) databases[items] sein, um den Wert zu erhalten, der mit dem Schlüssel items verknüpft ist.

+0

Das scheint Fortschritte zu machen. Ich bekomme 'eine oder mehrere undefinierte Variablen: dict object hat kein Element', aber die Werte werden in der Fehlerausgabe angezeigt. Alle Variablen haben Werte in der Ausgabe. Irgendwelche Ideen? – tweeks200

2

Ich entdeckte heute, dass die Verwendung von dict.values ​​() die Werte jedes dict-Elements und nicht seine Schlüssel überschleift. Sie sollten also so etwas für Ihre Vorlage verwenden können.

Ich weiß, dass es weit nach der Tat ist, aber vielleicht kann jemand anderes, der nach dieser Antwort sucht, diese zusätzliche Entdeckung nutzen.

Verwandte Themen