てくなべ (tekunabe)

ansible / network / automation

[Ansible] リスト内の要素の重複を排除してユニークにする unique フィルター


これは Ansible 2 Advent Calendar 2019 の5日目の記事です。

はじめに

Ansible には、値に対して様々な処理をするフィルターがあります。

unique フィルターは、リスト内の要素の重複を排除してユニークにするフィルターです。

簡単なサンプルでご紹介します。


サンプル

Playbook

タスク unique test 1 では、 1 が2つ、3 が3つあります。それぞれの重複は排除されます。

タスク unique test 2 も似ていますが、 数字の 1 と、クォーテーションで囲った文字 '1' があります。1'1' は別物なので、重複排除されずに特に変更は加えられません。

- hosts: localhost
  gather_facts: no

  tasks:
    - name: unique test 1
      debug:
        msg: "{{ [1, 1, 2, 3, 3, 3, 4, 5] | unique }}"

    - name: unique test 2
      debug:
        msg: "{{ [1, '1', 2, 3, 3, 3, 4, 5] | unique }}"

Playbook の実行

Playbook を実行します。

$ ansible-playbook -i localhost, filter_test.yml 

PLAY [localhost] ***************************************************************

TASK [unique test 1] ***********************************************************
ok: [localhost] => {
    "msg": [
        1,
        2,
        3,
        4,
        5
    ]
}

TASK [unique test 2] ***********************************************************
ok: [localhost] => {
    "msg": [
        1,
        "1",
        2,
        3,
        4,
        5
    ]
}

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  • unique test 1 では
    • [1, 1, 2, 3, 3, 3, 4, 5]
    • [1, 2, 3, 4, 5]
  • unique test 2 では
    • [1, '1', 2, 3, 3, 3, 4, 5]
    • [1, "1", 2, 3, 4, 5]

になりました。


少しだけ応用: count フィルターと組み合わせる

count と組み合わせると、 重複排除の件数をカウント出来ます。 SQLdistinctcount と組合わえたようなイメージです。

具体的な例としては

msg: "{{ [1, 1, 2, 3, 3, 3, 4, 5] | unique | count }}"

の結果は、

    "msg": "5"

になります。


まとめ

リスト内の要素の重複を排除してユニークにする unique フィルターをご紹介しました。

他にも色々なフィルターがあるので、公式ドキュメントを眺めてみると、新たな発見があるかもしれません。