web-dev-qa-db-ja.com

Ansible-リストからアイテムを削除する方法は?

別のリストに基づいて、リストからアイテムを削除したいのですが。

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

私の2番目のリスト:

"my_list_two": [
    "item3"
] }

このリストから「item3」を削除して、新しいファクトを設定するにはどうすればよいですか?
「-」とこれを使用してみました:

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

最終目標:

"my_list_one": [
    "item1",
    "item2"
] }
9
Kevin C

difference を使用するunionではない:

{{ my_list_one | difference(my_list_two) }}

プレイブックの例(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"
    ]
}
13
techraf

Ansible-理論フィルターの設定

2つのリストの違い(2に存在しない1のアイテム)を取得するには:

_{{ 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]
_
4
cricket_007