Vous cherchez de l'aide pour un problème avec lequel je me bats depuis quelques heures. Je veux parcourir une liste, exécuter une commande, enregistrer la sortie de chaque commande, puis répéter avec un débogage sur chaque registre unique {{someregister}}. Stdout
Par exemple, le code suivant crachera "" msg ":" 1 " et " msg ":" 2 "
---
- hosts: localhost
gather_facts: false
vars:
numbers:
- name: "first"
int: "1"
- name: "second"
int: "2"
tasks:
- name: Register output
command: "/bin/echo {{ item.int }}"
register: result
with_items: "{{ numbers }}"
- debug: msg={{ item.stdout }}
with_items: "{{ result.results }}"
Si toutefois j'essaie de capturer la sortie d'une commande dans une variable de registre nommée à l'aide de with_list, j'ai du mal à accéder à la liste ou aux éléments qu'elle contient. Par exemple, en modifiant légèrement le code pour:
---
- hosts: localhost
gather_facts: false
vars:
numbers:
- name: "first"
int: "1"
- name: "second"
int: "2"
tasks:
- name: Register output
command: "/bin/echo {{ item.int }}"
register: "{{ item.name }}"
with_items: "{{ numbers }}"
- debug: var={{ item.name.stdout }}
with_items: "{{ numbers }}"
Donne moi:
TASK [debug]
> ******************************************************************* fatal: [localhost]: FAILED! => {"failed": true, "msg": "'unicode
> object' has no attribute 'stdout'"}
N'est-il pas possible de nommer dynamiquement le registre en sortie d'une commande qui pourra ensuite être appelée plus tard dans le jeu? Je voudrais que chaque itération de la commande et son registre soit accessible uniquement, par exemple, étant donné le dernier exemple que j'ai s'attendrait à ce qu'il y ait des variables enregistrées appelées "première" et "seconde" mais il n'y en a pas.
Supprimer les with_items de la strophe de débogage et définir simplement explicitement le var ou le message en utilisant first.stdout renvoie "undefined".
La version Ansible est 2.0.2.0 sur Centos 7_2.
Merci d'avance.
OK donc j'ai trouvé un post sur stackoverflow qui m'a aidé à mieux comprendre ce qui se passe ici et comment accéder aux éléments dans result.results.
Le code résultant avec lequel je me suis retrouvé était:
---
- hosts: localhost
gather_facts: false
vars:
numbers:
- name: "first"
int: "1"
- name: "second"
int: "2"
tasks:
- name: Register output
command: "/bin/echo {{ item.int }}"
register: echo_out
with_items: "{{ numbers }}"
- debug: msg="item.item={{item.item.name}}, item.stdout={{item.stdout}}"
with_items: "{{ echo_out.results }}"
Ce qui m'a donné le résultat souhaité:
"msg": "item.item=first, item.stdout=1"
"msg": "item.item=second, item.stdout=2"
Je ne sais pas si je comprends bien la question, mais cela peut peut-être aider:
- debug: msg="{{ item.stdout }}"
with_items: echo_out.results
Veuillez noter qu'Ansible imprimera chaque item et les msg les deux - vous devez donc rechercher attentivement une ligne qui ressemble à "msg": "2"
.