在ansible with_items循环中跳过某些条件

时间:2016-05-12 14:23:09

标签: filter ansible skip

是否可以在有条件的情况下跳过Ansible with_items循环运算符中的某些项,而不会产生额外的步骤?

仅举例:

- name: test task
    command: touch "{{ item.item }}"
    with_items:
      - { item: "1" }
      - { item: "2", when: "test_var is defined" }
      - { item: "3" }

在此任务中,我只想在定义test_var时创建文件2。

5 个答案:

答案 0 :(得分:13)

另一个答案是关闭但会跳过所有项目!= 2.我认为这不是你想要的。这就是我要做的事情:

- hosts: localhost
  tasks:
  - debug: msg="touch {{item.id}}"
    with_items:
    - { id: 1 }
    - { id: 2 , create: "{{ test_var is defined }}" }
    - { id: 3 }
    when: item.create | default(True) | bool

答案 1 :(得分:4)

我有一个类似的问题,我所做的是:

...
with_items:
  - 1
  - 2
  - 3
when: (item != 2) or (item == 2 and test_var is defined)

哪个更简单,更干净。

答案 2 :(得分:3)

评估每个项目的when:条件。所以在这种情况下,您可以这样做:

...
with_items:
- 1
- 2
- 3
when: item != 2 and test_var is defined

答案 3 :(得分:0)

您想要的是始终创建文件1和文件3,但仅在定义test_var时才创建文件2。如果你在条件下使用ansible,它可以完成任务而不是像这样的单个项目:

- name: test task
  command: touch "{{ item.item }}"
  with_items:
      - { item: "1" }
      - { item: "2" }
      - { item: "3" }
  when: test_var is defined

此任务将检查所有三个行项目1,2和3的条件。

但是,您可以通过两个简单的任务来实现这一目标:

- name: test task
  command: touch "{{ item }}"
  with_items:
      - 1 
      - 3

- name: test task
  command: touch "{{ item }}"
  with_items:
      - 2
  when: test_var is defined

答案 4 :(得分:0)

我最近遇到了这个问题,发现的答案都不是我一直在寻找的答案。我想要一种基于另一个变量有选择地包括with_item的方法。 这是我想出的:

- name: Check if file exists
  stat: 
    path: "/{{item}}"
  with_items: 
    - "foo"
    - "bar"
    - "baz"
    - "{% if some_variable == 'special' %}bazinga{% endif %}"
   register: file_stat

- name: List files
  shell: echo "{{item.item | basename}}"
  with_items:
    - "{{file_stat.results}}"
  when: 
    - item.stat | default(false) and item.stat.exists

运行上述播放后,如果 some_variable ,file_stat中的项目列表将仅包含 bazinga =='特殊'