列表中的Ansible项目

时间:2016-02-16 23:33:03

标签: ansible jinja2 devops ansible-2.x

item_list: [data, database, proddata]

我正在尝试进行条件when: item.name in item_list

如何使when子句显式化,以便如果我循环的项目列表仅为[data],那么'database'和'proddata'不会将条件传递为true?我只希望通过精确拼写。

实施例

---

- name: Explicit example
  hosts: localhost
  connection: local
  vars:
    source_list: 
      - name: proddata
      - name: data
      - name: other
    dest_list1: [this, thing]
    dest_list2: [database, proddata]
    final_list: '{{ dest_list1 | union(dest_list2) | join(",") }}'

  tasks:
  - name: test
    debug:
      msg: '{{ item.name }}'
    with_items: 
      - '{{ source_list }}'
    when: item.name in final_list

正如您所看到的,data不在final_list中,但它显示为真。我相信因为数据包含在prod 数据数据库中。如果可能,我希望when: item.name == (item.name in final_list)。我只是不确定我需要哪种过滤器。

1 个答案:

答案 0 :(得分:2)

如果您的final_list是一个列表而不是一个逗号分隔值的字符串,那么它会起作用。

所以如果你的var定义是这样的:

final_list: '{{ dest_list1 | union(dest_list2) }}'

条件

when: item.name in final_list

会起作用。

但我认为你将它存储为字符串是有原因的,因为你在其他地方使用它。如果是这种情况并且您无法更改它(您可以将join作为字符串进行操作),您只需将其拆分为您的条件:

when: item.name in final_list.split(",")