2014-09-22 6 views
10

Sto provando a scrivere un'attività che esegue un elenco di istruzioni ldapmodify e voglio solo che fallisca se uno dei codici di ritorno non è 0 o 68 (oggetto giá esisteva):Uso di `failed_when` su un'attività` with_items` in base ai codici di ritorno

- name: add needed LDAP infrastructure 
    action: command ldapmodify -x -D '{{ ADMINDN }}' -w '{{ LDAPPW }}' -H {{ LDAPURI }} -c -f {{ item }} 
    register: result 
    failed_when: "result.results | rejectattr('rc', 'sameas', 0) | rejectattr('rc', 'sameas', 68) | list | length > 0" 
    # ignore_errors: true 
    with_items: 
    - a.ldif 
    - b.ldif 

non funziona, produce l'errore:

error while evaluating conditional: result.results | rejectattr('rc', 'sameas', 0) | rejectattr('rc', 'sameas', 68) | list | length > 0 

Tuttavia, se io commento la failed_when e utilizzare ignore_errors, le seguenti attività producono i risultati corretti. Mentre posso utilizzare questa soluzione alternativa per risolvere il mio problema, mi piacerebbe capire perché la versione failed_when non funziona, come troverei quella più elegante.

- debug: var="result.results | rejectattr('rc', 'sameas', 0) | rejectattr('rc', 'sameas', 68) | list | length > 0" 
- fail: msg="failure during ldapmodify" 
    when: "result.results | rejectattr('rc', 'sameas', 0) | rejectattr('rc', 'sameas', 68) | list | length > 0" 

Sidenote sameas potrebbe essere equalto in altre versioni di Jinja2, nel caso in cui vi state chiedendo.

risposta

17

Bene, risulta che lo stavo facendo troppo complicato. Il problema era: Ansible corre failed_when dopo ogni iterazione del ciclo. Come tale ho semplicemente bisogno di accedere result.rc:

- name: add needed LDAP infrastructure 
    action: command ldapmodify -x -D '{{ ADMINDN }}' -w '{{ LDAPPW }}' -H {{ LDAPURI }} -c -f {{ item }} 
    register: result 
    # As per comment from user "ypid" 
    failed_when: (result.rc not in [ 0, 68 ]) 
    # failed_when: (result.rc != 0) and (result.rc != 68) 
    with_items: 
    - a.ldif 
    - b.ldif 

produce il risultato voluto.

Dopo il ciclo la variabile result è riempito con un dizionario di sintesi che ha i dettagli di ogni elemento nella chiave results.

Ma poiché non sono riuscito a trovare alcun esempio di utilizzo di result.results con catene di filtri, lascerò questa domanda, sperando che qualcun altro possa trovarlo utile. (Sono sicuro che alla fine vorrò cercarlo di nuovo un giorno;))

Grazie a sivel on # è possibile indicarlo.

Problemi correlati