てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] true か false か null かで返す値を変える ternary フィルター

はじめに

ternary フィルターは、対象の値が truefalse かに応じて別の値を返します。

Jinja2 の if をいれる必要はありません。

この記事では、簡単なサンプルでご紹介します。

  • 環境
    • ansible 2.9.14


truefalse

この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": "不一致"
}


truefalsenull

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 らしいのかなと思います。

参考

docs.ansible.com