コンテンツにスキップ

Jinja2テンプレート

増えたらToolsとかに移すかも

Templating (Jinja2) — Ansible Documentation

オンラインパーサー

TTL255 J2Live - Live Jinja2 Parser

変数

変数宣言

変数

{% set hogehoge = 'foobar' %}

配列

{% set array = [] %}

配列要素の追加

↑のarrayに要素を追加したい場合、Ansibleではarray.append()は使えるように見えて使えない。
↓のように書く。

{% set _ = array.append('item') %} 

これに do を追加して {% do list.append(1) %} と書けるようにする Expression Statement という拡張もあるらしいのですが Ansible では有効化されていませんので、面倒ですが {% if list.append(1) %}{% endif %}{% set _ = list.append(1) %} のように他のステートメントの中で評価したい式を書く必要があります。

ほげめも: Ansible の Jinja2 を活用する

辞書をリストの要素として追加は普通にOK

{% set _ = host_list.append({'host': host, 'name': hostvars[host].tags.User }) %}

制御構文

ループ

リストに対するfor構文は、foreach式で配列要素をループ毎に処理できる

{% for item in array_value %}
...
{% endfor %}

array_valueの配列要素がitemにセットされてループ処理される。

ループインデックス

ループブロック内でloop.index0という変数参照でループインデックスを取り出せる(ゼロオリジン)

コメント

{# comment #}

複数行もOK

{#
{% for item in list %}
{% endfor %}
#}

lookupプラグイン実行

playbook等で書くときと同じ要領で記述可能

{{ lookup('pipe', 'date +%s') }}

指定部分へのフィルタの実行

indent()

{% filter indent(4, true) %}
{{ sample_string }}
{% endfilter %}
---
- hosts: localhost
  gather_facts: false
  vars:
    sample_string: |
      int main() {
        return 0;
      }

  tasks:
    - name: j2 saple
      template:
        src: indent_sample.txt.j2
        dest: /var/tmp/indent_sample.txt

実行結果は以下の通り、スペース4文字分のインデントが入る。

    int main() {
      return 0;
    }