LoginSignup
2
3

More than 3 years have passed since last update.

【Ansible】ハイフンの位置による改行の変化~templateモジュール編~

Posted at

はじめに

<バージョン>
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文の開始位置、終了位置の前後それぞれにハイフンを入れます

template_sample1.j2
start
{%- for i in range(2) -%}
apple{{ i }}
orange{{ i }}
{%- endfor -%}
end

パターン1:実行結果

appleとorangeの間だけ改行が入ります。
for文の中に書いてある内容は勝手に改行してくれるようです。

出力
startapple0
orange0apple1
orange1end

パターン2:for文開始位置の手前のハイフンを消す

template_sample2.j2
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文開始位置の後ろのハイフンを消す

template_sample3.j2
start
{%- for i in range(2) %}
apple{{ i }}
orange{{ i }}
{%- endfor -%}
end

パターン3:実行結果

全てにハイフンを入れた場合と同じ結果になりました。
for文開始位置の後ろは、入れても入れなくても変化が無いようです。

出力
startapple0
orange0apple1
orange1end

パターン4:for文終了位置の手前のハイフンを消す

template_sample4.j2
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文終了位置の後ろのハイフンを消す

template_sample5.j2
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文終了位置の後ろのハイフンを取り除いても
効果はないので、最初に書いたような出力結果は得られません。(追加で対策が必要)
しかし、全てのハイフンを取り除けば、全ての行で改行することは可能ですので
出力した行同士が繋がってしまうということは起きません。

template_sample6.j2
start
{% for i in range(2) %}
apple{{ i }}
orange{{ i }}
{% endfor %}
end
出力
start
apple0
orange0
apple1
orange1
end

関連記事

【jinja2】ハイフンの位置による改行の変化

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3