はじめに
<バージョン>
ansible 2.9.1
templateモジュールでは、jinja2というテンプレートエンジンを用いてファイルを生成出来ます。
しかし、for文等を書く場合、pythonでjinja2を用いた場合と改行のされ方が異なるようです。
jinja2の改行のされ方については、過去の記事を見て下さい。
【jinja2】ハイフンの位置による改行の変化
では、templateモジュールでも以下のような結果を得ることが出来るのでしょうか?
start
apple0
orange0
apple1
orange1
end
参考Playbook
今回は、共通で以下のPlaybookを使用します。
---
- name: template TEST
hosts: localhost
gather_facts: no
vars:
ansible_python_interpreter: /usr/bin/python3
tasks:
- name: 'template'
template:
src: template_sample1.j2 #ファイル名はパターンによって異なります
dest: result.txt
パターン1:全てにハイフンを入れる
以下のテンプレートが今回の基準になります。
for文の開始位置、終了位置の前後それぞれにハイフンを入れます
start
{%- for i in range(2) -%}
apple{{ i }}
orange{{ i }}
{%- endfor -%}
end
パターン1:実行結果
appleとorangeの間だけ改行が入ります。
for文の中に書いてある内容は勝手に改行してくれるようです。
startapple0
orange0apple1
orange1end
パターン2:for文開始位置の手前のハイフンを消す
start
{% for i in range(2) -%}
apple{{ i }}
orange{{ i }}
{%- endfor -%}
end
パターン2:実行結果
startとapple0の間が改行されました。
for文開始位置の手前は、for文の開始時に1回だけ改行します。
ここはjinja2と同じ動作をするようです。
start
apple0
orange0apple1
orange1end
パターン3:for文開始位置の後ろのハイフンを消す
start
{%- for i in range(2) %}
apple{{ i }}
orange{{ i }}
{%- endfor -%}
end
パターン3:実行結果
全てにハイフンを入れた場合と同じ結果になりました。
for文開始位置の後ろは、入れても入れなくても変化が無いようです。
startapple0
orange0apple1
orange1end
パターン4:for文終了位置の手前のハイフンを消す
start
{%- for i in range(2) -%}
apple{{ i }}
orange{{ i }}
{% endfor -%}
end
パターン4:実行結果
orange0とorange1の後ろに改行が入るようになりました。
for文終了位置の手前は、for文内の最終行で毎回改行します。
ここはjinja2と同じ動作をするようです。
startapple0
orange0
apple1
orange1
end
パターン5:for文終了位置の後ろのハイフンを消す
start
{%- for i in range(2) -%}
apple{{ i }}
orange{{ i }}
{%- endfor %}
end
パターン5:実行結果
全てにハイフンを入れた場合と同じ結果になりました。
for文終了位置の後ろは、入れても入れなくても変化が無いようです。
startapple0
orange0apple1
orange1end
まとめ
今までの内容を踏まえると以下のようになります。
jinja2と動作が異なっていることがわかります。
ハイフンを消す位置 | 改行の仕方 |
---|---|
for文開始位置の手前 | for文開始時に1回だけ改行 |
for文開始位置の後ろ | 変化なし |
for文終了位置の手前 | ループの末端で毎回改行 |
for文終了位置の後ろ | 変化なし |
つまり、for文開始位置の後ろとfor文終了位置の後ろのハイフンを取り除いても
効果はないので、最初に書いたような出力結果は得られません。(追加で対策が必要)
しかし、全てのハイフンを取り除けば、全ての行で改行することは可能ですので
出力した行同士が繋がってしまうということは起きません。
start
{% for i in range(2) %}
apple{{ i }}
orange{{ i }}
{% endfor %}
end
start
apple0
orange0
apple1
orange1
end