2016-06-22 14 views
5

Что делать, если я хочу пропустить весь цикл в Ansible?Пропустить весь цикл в Ansible

Согласно рекомендациям,

Хотя объединение when с with_items (см Loops), ... when заявление обрабатывается отдельно для каждого элемента.

Таким образом при выполнении пьес, как, что

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

Я получаю

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

В то время как я не хочу условие, чтобы проверить каждый раз.

Тогда я придумал идею использования встроенных условий

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

кажется решить мою проблему, но тогда я ничего не получаю, как выход. И я хочу только одну строку, говоря:

skipping: Loop has been skipped 
+0

Я не думаю, что вы можете получить лучший результат чем ваш второй. Вы могли бы просто добавить отладку после этого, если вам действительно нужно что-то распечатано – SztupY

+0

@SztupY, я уже сделал это, но все же это не желаемый результат, к сожалению –

+0

любая причина, по которой вы не хотите, чтобы условие выполнялось для каждого цикл? Это только из-за уродливого вывода или из-за того, что условные проверки занимают много времени/ресурсов? – SztupY

ответ

2

Вы должны быть в состоянии сделать анзибль оценить состояние только один раз с анзибль 2-х blocks.

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

Это будет по-прежнему показывать пропущено для каждого элемента и каждого хоста, но, как udondan указал, если вы хотите, чтобы подавить вывод, который вы можете добавить:

display_skipped_hosts=True 

ansible.cfg file вашему.

+0

Это похоже на то, о чем я просил, но он все еще не подавляет вывод. Для выхода нужно пропустить каждую задачу, а не пропустить блок. Есть ли способ переопределить вывод? –

+0

Действительно ли это работает? Я бы подумал, что «когда» просто передается в заданные задачи блока. Но если это работает, это здорово! – udondan

+0

@NickRoz Вы не можете подавить вывод на уровне задачи. Хотя вы можете отключить вывод пропущенных задач в глобальном масштабе в вашем ansible config: http://docs.ansible.com/ansible/intro_configuration.html#display-skipped-hosts – udondan

0

Это можно легко сделать с помощью include наряду с условием:

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

В то время как где-то в tasks/ есть файл под названием loop.yml:

- command: echo "{{ item }}" 
    with_items: [1, 2, 3] 
Смежные вопросы