これは 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
と組み合わせると、 重複排除の件数をカウント出来ます。
SQL の distinct
と count
と組合わえたようなイメージです。
具体的な例としては
msg: "{{ [1, 1, 2, 3, 3, 3, 4, 5] | unique | count }}"
の結果は、
"msg": "5"
になります。
まとめ
リスト内の要素の重複を排除してユニークにする unique
フィルターをご紹介しました。
他にも色々なフィルターがあるので、公式ドキュメントを眺めてみると、新たな発見があるかもしれません。