てくなべ (tekunabe)

ansible / network / automation

[Ansible] 文字列にキャストして連結する演算子 ~

はじめに

~ は、文字列を連結する演算子です。

文字列の連結というと + でいいのでは?と思った方もいるかも知れません。(私もそうでした)

+ の場合は、型によって挙動が異なります(数字の場合は足し算)。

一方で ~ は、数字が与えられても文字列にキャストして連結する動きになります。

この記事ではかんたんなサンプルをご紹介します。

  • 動作環境
    • Ansible 2.9.9
    • Jinja2 2.11.2

サンプル

---
- hosts: localhost
  gather_facts: false

  tasks:
    - name:
      debug:
        msg: "{{ 123 ~ 456 }}"

文字列として 123456 を連結します。

ok: [localhost] => {
    "msg": "123456"
}

仮に "{{ 123 + 456 }}" とした場合は、数値としてたされて

ok: [localhost] => {
    "msg": "579"
}

もし + を使いつつ、文字列として連結したい場合は | string でキャストする必要があります。

        msg: "{{ (123 | string) + (456 | string) }}"  # "123456" 

また、 + の場合、文字列と数値の組み合わせの場合はエラーになります。

        msg: "{{ 'Hello' + 1 }}"

エラー

fatal: [localhost]: FAILED! => {"msg": "Unexpected templating type error occurred on ({{ 'Hello' + 1 }}): must be str, not int"}

こんな場合でも ~ であれば、お互いを文字列として扱います。

        msg: "{{ 'Hello' ~ 1 }}"

結果

ok: [localhost] => {
    "msg": "Hello1"
}

おわりに

連結したい値の型によらずに文字列として連結したいときに、| string をわざわざ書かずにスッキリして良いと思います。