在Ansible中跳过整个循环

时间:2016-06-22 09:45:31

标签: loops ansible conditional-statements jinja2

如果我想在Ansible中跳过整个循环,我该怎么办?

根据指南,

  

whenwith_items合并(请参阅循环)时,会为每个项目单独处理... 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

2 个答案:

答案 0 :(得分:2)

你应该能够使用Ansible 2 blocks让Ansible评估一次这个条件。

---
- 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

答案 1 :(得分: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]