2016-06-22 23 views
5

Co powinienem zrobić, jeśli chcę pominąć całą pętlę w Ansible?Pomiń całą pętlę w Ansible

Zgodnie z wytycznymi,

Podczas łączenia when z with_items (patrz Loops), ... when oświadczenie jest przetwarzany osobno dla każdej pozycji.

Dzięki temu podczas jazdy playbook jak ten

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

uzyskać

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

Podczas gdy nie chcę warunek należy sprawdzić za każdym razem.

Potem wpadł na pomysł wykorzystania warunków inline

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

Wydaje się rozwiązać mój problem, ale potem mam nic jako wyjścia. I chcę tylko jedną linię mówiąc:

skipping: Loop has been skipped 
+0

Nie sądzę, można uzyskać lepszy wynik niż twoja druga. Możesz dodać instrukcję debugowania, jeśli naprawdę potrzebujesz czegoś wydrukować – SztupY

+0

@SztupY, już to zrobiłem, ale nadal nie jest to pożądany wynik, niestety –

+0

żadnego powodu, dla którego warunek nie powinien być uruchamiany dla każdego pętla? Czy to tylko z powodu brzydkiego wyniku, czy też dlatego, że kontrole warunkowe zajmują dużo czasu/zasobów? – SztupY

Odpowiedz

2

powinieneś być w stanie dokonać oceny stanu ansibl tylko raz ansibl 2 na blocks.

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

To jeszcze pokaże pominięte dla każdego elementu i każdego hosta, ale jak udondan wskazał, jeśli chcesz, aby stłumić wyjście można dodać:

display_skipped_hosts=True 

do ansible.cfg file.

+0

To wydaje się być tym, o co prosiłem, ale nadal nie tłumi wyjścia. W przypadku wyjścia chodzi o pominięcie każdego zadania, a nie o pomijanie bloku. Czy istnieje sposób na zastąpienie wyjścia? –

+0

Czy to naprawdę działa? Pomyślałbym, że "kiedy" po prostu zostanie przekazane do zamkniętych zadań bloku. Ale jeśli to działa, to jest świetne! – udondan

+0

@NickRoz Nie można pominąć wyjścia na poziomie zadania. Chociaż globalnie można pominąć wyniki pominiętych zadań w konfiguracji ansibli: http://docs.ansible.com/ansible/intro_configuration.html#display-skipped-hosts – udondan

0

Można to zrobić łatwo za pomocą include wraz z warunku:

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

Podczas gdy gdzieś w tasks/ znajduje się plik o nazwie loop.yml:

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