2016-12-02 34 views
5

Chciałbym usunąć przedmiot z listy na podstawie innej listy.Ansible - jak usunąć przedmiot z listy?

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

Moja druga lista:

"my_list_two": [ 
    "item3" 
] } 

Jak mogę usunąć 'ITEM3' z tej listy, aby ustawić nowy fakt?
Próbowałem za pomocą '-' a to:

set_fact: "{{ my_list_one | union(my_list_two) }}" 

celem Koniec:

"my_list_one": [ 
    "item1", 
    "item2" 
] } 
+0

Nie sądzę, zrozumieć sens 'unia. Chcesz różnicę –

Odpowiedz

7

Zastosowanie difference nie union:

{{ my_list_one | difference(my_list_two) }} 

Przykładem PlayBook (uwaga, że musi również podać nazwę zmiennej do 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 

Wynik (fragment):

TASK [debug] ******************************************************************* 
ok: [localhost] => { 
    "my_list_one": [ 
     "item1", 
     "item2" 
    ] 
} 
+0

Doskonały przykład! Dzięki. – rujmah

1

Ansible - Set Theory Filters

Aby uzyskać różnicę 2 pozycje w listach (1, które nie istnieją w 2):

{{ list1 | difference(list2) }} 

Uwaga: Zamów spraw, więc chcesz {{ my_list_one | difference(my_list_two) }}


Ponieważ jest to tylko szablon Jinja2, w czystym Pythonie list - list nie jest zdefiniowana.

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' 

Zamiast tego można zrobić list-zrozumieniem

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