てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] Python の str.format() のようなことをする

はじめに

Ansible ではテンプレートエンジンとして Jinja2 を利用しています。 Jinja2 書式内で、Pythonstr.format()のようなことをする方法を2つ紹介します。

  • 検証環境

方法1: .format() メソッドを利用する

Pythonstr.format() を呼び出すような方法です。

  • Playbook 抜粋
    - name: bracket only
      debug:
        msg: "{{ 'Hello, {}!'.format('Kingyo') }}"
        # 結果
        # "Hello, Kingyo!"

    - name: number
      debug:
        msg: "{{ 'Hello, {0}!'.format('Kingyo') }}"
        # 結果
        # "Hello, Kingyo!"
      
    - name: keyword
      debug:
        msg: "{{ '{greeting}, {name}!'.format(greeting='Hello', name='Kingyo') }}"
        # 結果
        # "Hello, Kingyo!"

方法2: format フィルターを利用する

Jinja2 の組み込みフィルターの format フィルターを利用する方法です。

    - name: filter test
      debug:
        msg: "{{ 'Hello, %s' | format('Kingyo!') }}"
        # 結果
        # "Hello, Kingyo!"

なお、format フィルターでは、以下のように {} は利用できません。

    - name: filter test
      debug:
        msg: "{{ 'Hello, {}!' | format('Kingyo') }}" 
        # 結果
        # エラー

補足

いずれも、Ansible の フィルターのドキュメントには掲載されていない方法ですが、掲載されていなくても Jinja2 自体の機能が使えるので、こんなこともできますね、ということです。 現在 Ansible の devel バージョンのドキュメントには以下の記載があります。

This page documents mainly Ansible-specific filters, but you can use any of the standard filters shipped with Jinja2 - see builtin filters in the official Jinja2 template documentation. You can also use Python methods to manipulate variables.