Puis-je utiliser Jinja2 `map` filtre dans une Ansible jouer pour obtenir les valeurs à partir d'un tableau d'objets?
J'ai un plan pour la création de certaines instances EC2 et ensuite de faire certaines choses avec eux. Les textes pertinents sont à peu près comme:
- name: create ec2 instances
ec2:
id: '{{ item.name }}'
instance_type: '{{ item.type }}'
register: ec2
with_items: '{{ my_instance_defs }}'
- name: wait for SSH
wait_for:
host: '{{ item.instances[0].private_ip }}'
port: 22
with_items: '{{ ec2.results }}'
Cela fonctionne comme prévu, mais je ne suis pas particulièrement heureux avec la item.instances[0].private_ip
expression, en partie parce qu'il montre vraiment de gros objets dans le jeu résumé. J'aimerais avoir la with_items
partie juste être un tableau d'adresses IP, plutôt qu'un tableau d'objets avec les tableaux d'objets à l'intérieur d'eux. En Python, je voudrais juste faire quelque chose comme:
ips = [r['instances'][0]['private_ip'] for r in ec2['results']]
Et puis je voudrais utiliser with_items: '{{ ips }}'
dans la deuxième tâche.
Est-il une manière que je peux faire la même chose à l'aide d'un J2 filtre dans le fichier YAML de la pièce? Semble comme http://docs.ansible.com/ansible/playbooks_filters.html#extracting-values-from-containers pourrait être utile, mais je pense que cela suppose, j'ai un tableau de clés/indices/whatever.
OriginalL'auteur amacleod | 2016-12-22
Vous devez vous connecter pour publier un commentaire.
carte filtrer votre ami ici.
Quelque chose comme ceci:
Le code ci-dessus n'est pas testé.
Vous pouvez essayer avec
debug
premier et ajouter petit à petitmap
s pour obtenir de résultat requis.N'oubliez pas de mettre
| list
à la fin pour rendre votre carte lisible.map
était censé travailler jusqu'à ce que j'ai lu votre exemple, et les docs à jinja.pocoo.org/docs/dev/templates/#builtin-filters. Aussi +1 pour lelist
conseils.Depuis que je suis en utilisant le tableau des IPs en plusieurs endroits, j'ai décidé d'utiliser
set_fact: ec2_ips={{ ec2.results | map(attribute="instances") | map("first") | map(attribute="private_ip") | list }}
.OriginalL'auteur Konstantin Suvorov
Mon exemple est tiré de mon playbook suppression d'une mise à l'échelle automatique de l'ecs cluster. J'ai modifié la réponse ci-dessus pour obtenir le mien de travail.
Pour mon utilisation hostlist peut être alimenté directement dans ecs_instance car il prend une liste d'id d'instance de processus.
Donc, c'est testé et fonctionne.
OriginalL'auteur mpechner