Comment faire une boucle sur ce dictionnaire en Ansible?
Dire que j'ai ce dictionnaire
war_files:
server1:
- file1.war
- file2.war
server2:
- file1.war
- file2.war
- file3.war
et pour l'instant je veux juste faire une boucle sur chaque élément (clé), puis sur chaque élément de la clé (de la valeur). J'ai fait ce
- name: Loop over the dictionary
debug: msg="Key={{ item.key }} value={{ item.value }}"
with_dict: "{{ war_files }}"
Et je reçois ce. Bien entendu, il est correct, mais n'est PAS ce que je veux.
ok: [localhost] => (item={'value': [u'file1.war', u'file2.war'], 'key': u'server1'}) => {
"item": {
"key": "server1",
"value": [
"file1.war",
"file2.war"
]
},
"msg": "Server=server1, WAR=[u'file1.war', u'file2.war']"
}
ok: [localhost] => (item={'value': [u'file1.war', u'file2.war', u'file3.war'], 'key': u'server2'}) => {
"item": {
"key": "server2",
"value": [
"file1.war",
"file2.war",
"file3.war"
]
},
"msg": "Server=server2, WAR=[u'file1.war', u'file2.war', u'file3.war']"
}
Je veux obtenir un résultat qui dit
"msg": "Server=server1, WAR=file1.war"
"msg": "Server=server1, WAR=file2.war"
"msg": "Server=server2, WAR=file1.war"
"msg": "Server=server2, WAR=file2.war"
"msg": "Server=server2, WAR=file3.war"
OIE, comment puis-je écrire une tâche à itère sur le dictionnaire de sorte qu'il passe par chaque touche, puis les éléments à l'intérieur de chaque clé? En essence, j'ai un tableau imbriqué et souhaitez effectuer une itération sur elle?
OriginalL'auteur Chris F | 2017-02-10
Vous devez vous connecter pour publier un commentaire.
Bien, je ne pouvais pas trouver un moyen très facile de le faire, cependant, avec un peu de jinja2, nous pouvons réaliser quelque chose de ce genre:
Et, lorsque le playbook est exécuté:
J'ai écrit jinja2, pas python.
Mais oui, je suis d'accord avec vous. La marionnette et le Chef ont un avantage sur Ansible à cause de cela.
Désolé, jinja2, pas Python. Merci encore!
Mieux utiliser
dict2items
etsubelements
mentionné par tmoschou. Cette solution fonctionne aussi mais augmente la complexité beaucoup.OriginalL'auteur Nehal J Wani
Faire ce
dict2items
,subelements
filtres sont à venir dans Ansible 2.6.Pour info, si un filtre pour votre objectif n'existe pas, vous pouvez écrire votre propre en python sans avoir à recourir à jinja2 hacks. Ansible est facilement extensible; filtres à
filter_plugins/*.py
sont recherchées par défaut à côté de votre joue/les rôles et sont automatiquement inclus - voir Développement De Plugins pour plus de détails.subelements
dans tous les cas. Essayezloop: "{{ users | dict2items }}"
et puismsg: "Key={{ item.key }} value={{ item.value }}
pour avoir une idée de ce que sont les possibilités. Voir docs.ansible.com/ansible/devel/user_guide/playbooks_loops.html et notez quewhen
est évaluée élément par élément.OriginalL'auteur tmoschou
Maintenant Ansible permet à cette
C'est une boucle sur une liste de dictionnaires, pas plus que les clés d'un dictionnaire comme à la question posée. @sjas donc cela ne devrait pas être accepté de répondre ;).
Peut-être pas accepté de réponse, mais je crois que c'est la meilleure façon d'aller.
Fondamentalement ne pas répondre à la question. Il y a trois niveaux pour la nidification, qui est le "vrai" problème. Aussi pour sauver la confusion, essayez à l'aide de l'exemple variables, afin de prouver votre réponse adresses.
OriginalL'auteur Artem Bernatskyi
Ici est ma manière préférée de la boucle sur les dictionnaires:
input_data.yml contient les éléments suivants:
Je puis utiliser une structure de données comme ci-dessus dans un jeu en utilisant les touches() et la fonction itérer sur les données à l'aide de with_items:
Ci-dessus playbook produit la sortie suivante:
Ma réponse s'adresse directement au titre de la question donc, ma réponse est utile pour les gens qui cherchent une réponse.
OriginalL'auteur M_dk
dict2items
Je me suis retrouvé à vouloir effectuer une itération sur un ensemble hétérogène de clés et leurs valeurs associées et l'utilisation de la paire clé-valeur dans une tâche. Le
dict2items
filtre est la moins douloureuse que j'ai trouvé. Vous pouvez trouver dict2items dans Ansible 2.6Exemple Dict
Exemple De Tâche
OriginalL'auteur Cameron Lowell Palmer