2016-06-22 8 views
5

Was soll ich tun, wenn ich die ganze Schleife in Ansible überspringen möchte?Überspringen Sie die ganze Schleife in Ansible

Richtlinien Laut,

Während when mit with_items (siehe Loops) kombiniert, ... when Anweisung wird separat für jedes Element verarbeitet.

Dadurch, während die Textbuch, wie die

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

Laufen bekomme ich

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

Während ich jedes Mal überprüft nicht eine Bedingung werden möchten.

Dann kam ich auf die Idee der Verwendung von Inline-Bedingungen

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

Es scheint bis mein Problem zu lösen, aber ich habe nichts als Ausgang dann. Und ich möchte nur eine Zeile zu sagen:

skipping: Loop has been skipped 
+0

Das glaube ich nicht, dass Sie ein besseres Ergebnis bekommen können als dein zweiter. Sie könnten einfach eine Debug-Anweisung hinterher hinzufügen, wenn Sie wirklich etwas ausgedruckt haben – SztupY

+0

@SztupY, ich habe es schon getan, aber es ist immer noch nicht das gewünschte Ergebnis, leider –

+0

irgendein Grund, warum Sie nicht wollen, dass die Bedingung für jeden läuft Schleife? Ist es nur wegen der hässlichen Ausgabe, oder weil die bedingten Prüfungen eine Menge Zeit/Ressource benötigen? – SztupY

Antwort

2

sollten Sie in der Lage sein, machen ansible den Zustand nur einmal mit ansible 2 der blocks bewerten.

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

Dieses noch übersprungen für jedes Element zeigen und jeden Host, sondern, wie udondan wies darauf hin, wenn Sie die Ausgabe zu unterdrücken möchten, können Sie hinzufügen:

display_skipped_hosts=True 

zu Ihrem ansible.cfg file.

+0

Das scheint das zu sein, wonach ich gefragt habe, aber es unterdrückt die Ausgabe immer noch nicht. Bei der Ausgabe geht es darum, jede Aufgabe zu überspringen, nicht den Block zu überspringen. Gibt es eine Möglichkeit, die Ausgabe zu überschreiben? –

+0

Funktioniert das wirklich? Ich hätte gedacht, dass das 'When' nur an die enthaltenen Aufgaben des Blocks weitergegeben wird. Aber wenn das funktioniert, ist das großartig! – udondan

+0

@NickRoz Sie können die Ausgabe auf Aufgabenebene nicht unterdrücken. Obwohl Sie die Ausgabe von übersprungenen Aufgaben global in Ihrer ansible Config deaktivieren können: http://docs.ansible.com/ansible/intro_configuration.html#display- skipped-hosts – udondan

0

Dies kann leicht getan werden include zusammen mit Bedingung mit:

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

Während irgendwo in tasks/ gibt es eine Datei namens loop.yml:

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