是否可以在有条件的情况下跳过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。
答案 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 =='特殊'