Ansible - 如何从列表中删除一个项目?

15
我想从一个列表中移除一项内容,基于另一个列表。

我希望删除列表中的某个项目,该项目与另一个列表有关。

"my_list_one": [
  "item1",
  "item2",
  "item3"
]

我的第二个列表:

"my_list_two": [
  "item3"
]
我如何从此列表中删除'item3'以设置新的事实?
我尝试使用'-'和union,但这不会得到所需的结果。
set_fact: 
  my_list_one: "{{ my_list_one | union(my_list_two) }}"

最终目标:

"my_list_one": [
  "item1",
  "item2"
]

我认为你不理解“联合体”的含义。你想要的是差异。 - OneCricketeer
2个回答

33

使用difference而不是union

{{ my_list_one | difference(my_list_two) }}

以下是一个示例playbook(请注意,您也必须为set_fact提供变量名称):

---
- hosts: localhost
  connection: local

  vars:
    my_list_one:
      - item1
      - item2
      - item3

    my_list_two:
      - item3

  tasks:
    - set_fact:
        my_list_one: "{{ my_list_one | difference(my_list_two) }}"

    - debug: var=my_list_one
结果(摘录):
TASK [debug] *******************************************************************
ok: [localhost] => {
    "my_list_one": [
        "item1",
        "item2"
    ]
}

非常棒的例子!谢谢。 - rujmah

5

Ansible - 集合理论过滤器

To get the difference of 2 lists (items in 1 that don’t exist in 2):

{{ list1 | difference(list2) }}

注意:顺序很重要,所以你想要{{ my_list_one | difference(my_list_two) }}


由于它只是一个Jinja2模板,在纯Python中,list - list没有定义。

In [1]: list1 = [1, 2, 3]

In [2]: list2 = [3]

In [3]: list1 - list2
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-a683b4e3266d> in <module>()
----> 1 list1 - list2

TypeError: unsupported operand type(s) for -: 'list' and 'list'

相反,你可以使用列表推导式。

In [5]: [i for i in list1 if i not in list2]
Out[5]: [1, 2]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接