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

Kev*_*n C 9 python jinja2 ansible

我想根据另一个列表从列表中删除一个项目.

"my_list_one": [
    "item1",
    "item2",
    "item3"
] }
Run Code Online (Sandbox Code Playgroud)

我的第二个清单:

"my_list_two": [
    "item3"
] }
Run Code Online (Sandbox Code Playgroud)

如何从此列表中删除"item3"以设置新事实?
我尝试使用' - '和这个:

set_fact: "{{ my_list_one | union(my_list_two) }}"
Run Code Online (Sandbox Code Playgroud)

最终目标:

"my_list_one": [
    "item1",
    "item2"
] }
Run Code Online (Sandbox Code Playgroud)

tec*_*raf 13

使用differenceunion:

{{ my_list_one | difference(my_list_two) }}
Run Code Online (Sandbox Code Playgroud)

示例剧本(请注意,您还必须提供变量名称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
Run Code Online (Sandbox Code Playgroud)

结果(摘录):

TASK [debug] *******************************************************************
ok: [localhost] => {
    "my_list_one": [
        "item1",
        "item2"
    ]
}
Run Code Online (Sandbox Code Playgroud)


cri*_*007 5

Ansible - 设置理论过滤器

\n\n
\n

要获取 2 个列表的差异(1 中不\xe2\x80\x99t 存在于 2 中的项目):

\n\n
{{ list1 | difference(list2) }}\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

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

\n\n
\n\n

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

\n\n
In [1]: list1 = [1, 2, 3]\n\nIn [2]: list2 = [3]\n\nIn [3]: list1 - list2\n---------------------------------------------------------------------------\nTypeError                                 Traceback (most recent call last)\n<ipython-input-3-a683b4e3266d> in <module>()\n----> 1 list1 - list2\n\nTypeError: unsupported operand type(s) for -: \'list\' and \'list\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

相反,您可以进行列表理解

\n\n
In [5]: [i for i in list1 if i not in list2]\nOut[5]: [1, 2]\n
Run Code Online (Sandbox Code Playgroud)\n