我在剧本中有这个var,并且有多个任务,我只想根据提示输入从vars列表中过滤项目。现在,我必须从多个任务中使用when排除该项目。请参见以下示例:
vars_prompt:
- name: rmetcd
prompt: "remove etcd: YES OR NO?"
private: no
vars:
containers:
- "etcd"
- "mysql"
- "postgres"
folders:
- "etcd"
- "mysql"
- "postgres"
tasks:
- name: remove container
shell: "docker rm -f {{ item }}"
with_items: "{{ containers }}"
when:
- '"etcd" not in item'
- name: remove folder
file:
path: "{{ item }}"
state: absent
with_items: "{{ folders }}"
when:
- '"etcd" not in item'
when: rmetcd == "NO"
答案 0 :(得分:1)
我会以相反的顺序解决问题:我不会为每个任务过滤列表以潜在地取出一个元素,而是会使用默认元素定义列表,并在用户回答是的情况下添加其他元素。
注意:您的两个列表相同,在下面的示例中,我仅保留了一个列表:
---
- hosts: localhost
gather_facts: false
vars_prompt:
- name: rmetcd
prompt: "Remove etcd [yes/no]?"
private: no
vars:
_default_services:
- mysql
- postgres
services: "{{ _default_services + (rmetcd | bool | ternary(['etcd'], [])) }}"
tasks:
- name: task1
debug:
msg: "remove container {{ item }}"
loop: "{{ services }}"
- name: taks2
debug:
msg: "remove folder {{ item }}"
loop: "{{ services }}"
要点:
_default_services
。这是将始终包含的服务列表。services
,它是两个列表的加法:_default_services
和根据用户输入要添加的附加值。对于这最后一个:
rmetcd
包含值(应为“是”或“否”)bool
filter将值转换为布尔值ternary
filter选择单个元素列表(如果为true,则为['etcd']
),如果是false,则使用空白列表([]
)。