はじめに
ternary
フィルターは、対象の値が true
か false
かに応じて別の値を返します。
Jinja2 の if
をいれる必要はありません。
この記事では、簡単なサンプルでご紹介します。
- 環境
- ansible 2.9.14
true
か false
か
この2値で分ける方法です。
Playbook
ternary
フィルターの第1引数には、フィルター対象が true
の場合の値、第2引数には false
の場合に返す値を指定します。
--- - hosts: localhost gather_facts: false tasks: - name: ternary test debug: msg: "{{ item | ternary('一致', '不一致') }}" loop: - "{{ (1 == 1) }}" # true - "{{ (1 == 0) }}" # false
実行
それぞれ、一致
、不一致
が表示されます。
TASK [ternary test] ************************************* ok: [localhost] => (item=true) => { "msg": "一致" } ok: [localhost] => (item=false) => { "msg": "不一致" }
true
か false
か null
か
ternary
フィルターの第3引数には、フィルター対象が null
の場合に返す値を指定します。
Playbook
先程の Playbook に加えて、第3引数を追加します。マッチさせるために、ループの最後に null
を追加します。
--- - hosts: localhost gather_facts: false tasks: - name: ternary test debug: msg: "{{ item | ternary('一致', '不一致', 'nullです') }}" # 第3引数を追加 loop: - "{{ (1 == 1) }}" # true - "{{ (1 == 0) }}" # false - null # null
実行
Playbook を実行します。null
のときは、第3引数で指定した nullです
が表示されます。
TASK [ternary test] ************************************ ok: [localhost] => (item=true) => { "msg": "一致" } ok: [localhost] => (item=false) => { "msg": "不一致" } ok: [localhost] => (item=None) => { "msg": "nullです" }
まとめ
Jinja2 の if
で埋め込んで同じことができるかもしれませんが、この程度であれば ternary
フィルターのほうがすっきりして Ansible らしいのかなと思います。