はじめに
Ansible ではテンプレートエンジンとして Jinja2 を利用しています。
Jinja2 書式内で、Python の str.format()
のようなことをする方法を2つ紹介します。
- 検証環境
- Ansible 2.9.1
- Python 3.6
方法1: .format()
メソッドを利用する
Python の str.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.