web-dev-qa-db-fra.com

itération en utilisant with_items et inscrivez-vous

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.

13
Rowley

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"
19
Rowley

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".

3
Amit