Boucle dictionnaire d'ansible modèle
Je suis en train de boucler un dictionnaire par le biais d'un ansible modèle à l'aide de jinja2 de créer un certain nombre de sources de données, mais cette erreur [{'msg': "AnsibleUndefinedVariable: One or more undefined variables: 'dict object' has no attribute 'value'", 'failed': True}]}
Lors de l'exécution d'une tâche de débogage il ne obtenir les valeurs correctes donc je pense que mon problème est dans le modèle lui-même, mais j'ai été incapable de comprendre ce que je fais de mal.
Ansible Tâche
- 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 Dictionnaire
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 Modèle
{% 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 %}
Sortie De Débogage
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"
}
- Pourquoi est votre deuxième tâche à l'aide de deux
with_items
etwith_dict
, surtout quand il ne semble pas être en faisant usage de celui-ci? Je serais très surpris si cela a effectivement travaillé. - Hmm, à l'origine, j'ai eu plusieurs fichiers dans cette tâche à l'aide de la with_items. Je l'ai enlevé mais toujours le même problème. Fait sens pour les séparer de leur bien, merci.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez atteindre votre objectif en modifiant votre jinja2 modèle et de la tâche comme ceci:
Jinja2 Modèle:
Ansible Tâches:
Espoir qui pourraient vous aider, s'il vous plaît ajuster vos tâches selon votre condition
À Jinja, quand
databases
est un dictionnaire,for items in databases
volonté (comme en Python) itérer sur les clés du dictionnaire, pas ses paires clé/valeur. Ainsi, dans le modèle,item.value
(qui je suppose est destiné à êtreitems.value
) doit êtredatabases[items]
afin d'obtenir la valeur associée à la cléitems
.One or more undefined variables: dict object has no element
maintenant, mais les valeurs ne montrons dans la sortie d'erreur. Toutes les variables ont des valeurs dans la sortie. Des idées?J'ai découvert aujourd'hui que l'aide de dict.les valeurs de() effectue une boucle sur chaque dict de l'élément de valeurs plutôt que sur ses touches. Donc, vous devriez être en mesure d'utiliser quelque chose comme cela pour votre modèle.
Je sais que c'est après le fait, mais peut-être que quelqu'un d'autre à la recherche pour cette réponse peut faire usage de cette découverte supplémentaires.
Mike, votre réponse m'a sauvé beaucoup de recherche aujourd'hui.
Dans mon cas, j'ai été en utilisant une liste de dicts, donc j'ai dû avoir deux si les déclarations, quelque chose comme ceci:
Merci!