Python のバージョンおよびテンプレート¶
Jinja2 テンプレートは、Python データタイプと標準機能を活用します。 これにより、 実行できる豊富な操作セットを作成します。 ただし、 これは、 基礎となる Python の特定の詳細がテンプレート作成者に表示されます。 Ansible Playbook はテンプレートと変数に Jinja2 を使用するため、 Playbook の作者が、 このような詳細に注意する必要があることも意味します。
特に明記しない限り、この違いは、 Python2 と Python3 で Ansible を実行する場合に限り重要です。 Python2 と Python3 内の変更は、 一般に、jinja2 レベルでは表示されないほど小さくなります。
ディクショナリービュー¶
Python2 では、dict.keys()
、dict.values()
、および dict.items()
の各メソッドがリストを返します。 Jinja2 は、
Ansible がリストに戻せる文字列表現で Ansible に返します。 Python3 では、
これらのメソッドは ディクショナリービュー オブジェクトを返します。 Jinja2 がディクショナリービューに対して返す文字列表現は、
Ansible が
解析してリストに戻すことができません。 ただし、
dict.keys()
、
dict.values()
、または dict.items()
を使用する場合は常に list
フィルターを使用することでこの移植性を容易にできます:
vars:
hosts:
testhost1: 127.0.0.2
testhost2: 127.0.0.3
tasks:
- debug:
msg: '{{ item }}'
# Only works with Python 2
#loop: "{{ hosts.keys() }}"
# Works with both Python 2 and Python 3
loop: "{{ hosts.keys() | list }}"
dict.iteritems()¶
Python2 では、ディクショナリーには iterkeys()
、
itervalues()
、および iteritems()
の各メソッドがあります。 この方法は、
Python3 で削除されました。 dict.keys()
、
dict.values()
、および dict.items()
を使用して、
Playbook と Jinja2 テンプレートを Python2 と Python3 の両方と互換性を持たせるようにします。
- vars:
- hosts:
- testhost1: 127.0.0.2 testhost2: 127.0.0.3
- tasks:
- debug:
msg: ‘{{ item }}’
# Only works with Python 2 #loop: “{{ hosts.iteritems() }}” # Works with both Python 2 and Python 3 loop: “{{ hosts.items() | list }}”
See also
- ここで、
list filter
が必要な理由は、 ディクショナリービュー エントリーを参照してください。