2016-02-26 13 views
8

Sto provando ad usare ansible per scorrere su un elenco di liste per installare alcuni pacchetti. Ma {{item}} sta restituendo ogni elemento nelle sotto liste piuttosto che la stessa sottolista. Ho un file YAML, che provengono da un elenco manifesta da ansible fuori e sembra che questo:ansible with_items l'elenco delle liste è appiattito

--- 
modules: 
- ['module','version','extra'] 
- ['module2','version','extra'] 
- ['module3','version','extra'] 

Il mio compito è simile al seguente:

task: 
- include_vars: /path/to/external/file.yml 
- name: install modules 
    yum: name={{item.0}} state=installed 
    with_items: "{{ modules }}" 

Quando eseguo che ottengo:

fatal: [localhost]: FAILED! => {"failed": true, "msg": "ERROR! int object has no element 0"} 

quando provo:

- debug: msg="{{item}}" 
    with_items: "{{module}}" 

stampa ogni elemento (modulo, versione, extra e così via), non solo il sottolista (che è quello che mi aspetterei)

risposta

3

@helloV già fornito la risposta che non si può fare questo usando with_items, ho intenzione di mostrare come è possibile utilizzare la struttura dati corrente con with_nested per ottenere il risultato desiderato.

Ecco un esempio playbook:

--- 
- hosts: 
    - localhost 
    vars: 
    - modules: 
     - ['module1','version1','extra1'] 
     - ['module2','version2','extra2'] 
     - ['module3','version3','extra3'] 

    tasks: 
    - name: Printing Stuffs... 
     shell: echo This is "{{ item.0 }}", "{{ item.1 }}" and "{{ item.2 }}" 
     with_nested: 
     - modules 

Ora si otterrà il seguente come stdout_lines:

This is module1, version1 and extra1 
This is module2, version2 and extra2 
This is module3, version3 and extra3 
+0

Giuro di averlo provato mentre stavo passando su varie opzioni. Ho appena provato di nuovo, e ha funzionato esattamente come speravo. – Neybar

+0

Quindi ho saltato la pistola, ancora non funziona. il mio datastructure ha una linea in esso al momento: cpann_modules: - [ 'Algorithm :: Diff', '0'] errore è: fallito: [alpha.bluehost.com] => (voce = [ u'A ', u'l', u'g ', u'o', u'r ', u'i', u't ', u'h', u'm ', u': ', u ':', u'D ', u'i', u'f ', u'f']) => {"changed": false, "failed": true, "item": ["A", "l", "g", "o", "r", "i", "t", "h", "m", ":", ":", "D", "i", "f "," f "]," msg ":" Nessun pacchetto corrispondente ... [errore troncato] si può vedere che sta tentando di ripetere su ogni carattere nella prima riga, che è stupido – Neybar

+0

@Neybar Come da esempio di domande, funziona per me come puoi vedere nella mia risposta ..potresti aggiungere il tuo esempio attuale alla domanda in modo che possa controllare .. – heemayl

3

Un modo alternativo per risolvere questo problema è quello di utilizzare un elemento complesso invece di una lista di lista. Strutturare le variabili in questo modo:

- modules: 
    - {name: module1, version: version1, info: extra1} 
    - {name: module2, version: version2, info: extra2} 
    - {name: module3, version: version3, info: extra3} 

Quindi è ancora possibile utilizzare with_items, in questo modo:

- name: Printing Stuffs... 
    shell: echo This is "{{ item.name }}", "{{ item.version }}" and "{{ item.info }}" 
    with_items: "{{modules}}" 
+0

Questo ha aiutato il mio caso con Ans ible 2.2.1. Si è imbattuto in un problema simile con la lista di liste in cui '{{item.0}}' è stato espanso in modo errato su '.' o '', e l'uso di un dizionario per elemento di elenco ha risolto questo problema. – RichVel

Problemi correlati