2016-06-22 75 views
5

Cosa devo fare se voglio saltare l'intero loop in Ansible?Salta l'intero loop in Ansible

Secondo le linee guida,

Mentre combinando when con with_items (vedi Loops), ... when dichiarazione viene elaborato separatamente per ciascuna voce.

In tal modo durante l'esecuzione del playbook del genere

--- 
- hosts: all 
    vars: 
    skip_the_loop: true 
    tasks: 
    - command: echo "{{ item }}" 
     with_items: [1, 2, 3] 
     when: not skip_the_loop 

ottengo

skipping: [localhost] => (item=1) 
skipping: [localhost] => (item=2) 
skipping: [localhost] => (item=3) 

Mentre io non voglio una condizione da controllare ogni volta.

Poi mi è venuta l'idea di utilizzare le condizioni in linea

- hosts: all 
    vars: 
    skip_the_loop: true 
    tasks: 
    - command: echo "{{ item }}" 
     with_items: "{{ [1, 2, 3] if not skip_the_loop else [] }}" 

Sembra di risolvere il mio problema, ma poi non ottengo niente come output. E voglio solo una riga dicendo:

skipping: Loop has been skipped 
+0

Non credo che si può ottenere un risultato migliore del tuo secondo. Puoi semplicemente aggiungere una dichiarazione di debug in seguito se hai davvero bisogno di qualcosa stampato – SztupY

+0

@SztupY, l'ho già fatto, ma comunque non è il risultato desiderato, purtroppo –

+0

qualsiasi motivo per cui non vuoi che la condizione venga eseguita per ogni ciclo continuo? È solo a causa del brutto output, o perché i controlli condizionali richiedono molto tempo/risorse? – SztupY

risposta

2

si dovrebbe essere in grado di fare Ansible valutare la condizione solo una volta con Ansible 2 di blocks.

--- 
- hosts: all 
    vars: 
    skip_the_loop: true 
    tasks: 
    - block: 
     - command: echo "{{ item }}" 
     with_items: [1, 2, 3] 
     when: not skip_the_loop 

Questo mostrerà ancora saltati per ogni elemento e ogni host, ma, come udondan sottolineato, se si vuole eliminare l'output è possibile aggiungere:

display_skipped_hosts=True 

al vostro ansible.cfg file.

+0

Sembra essere quello che ho chiesto, ma non sopprime l'output. Per l'output si tratta di saltare ogni attività, non di saltare il blocco. C'è un modo per ignorare l'output? –

+0

Funziona davvero? Avrei pensato che il 'quando' venisse passato ai compiti contenuti del blocco. Ma se funziona è grandioso! – udondan

+0

@NickRoz Non è possibile sopprimere l'output a livello di attività. Anche se puoi disabilitare l'output delle attività saltate a livello globale nella tua configurazione ansible: http://docs.ansible.com/ansible/intro_configuration.html#display-skipped-hosts – udondan

0

Questo può essere fatto facilmente usando include insieme a condizione:

hosts: all 
    vars: 
    skip_the_loop: true 
    tasks: 
    - include: loop 
     when: not skip_the_loop 

Mentre da qualche parte nel tasks/ c'è un file chiamato loop.yml:

- command: echo "{{ item }}" 
    with_items: [1, 2, 3]