Problem
Ansibleのtemplateモジュールでvarsに定義したバックスラッシュ\
を含む文字列を出力する場合、varsで'\'
のようにシングルクォートで囲めばバックスラッシュのまま出力されますが、to_json
フィルタでJSONとして出力させようとすると、\\
のように勝手にエスケープされてしまいます。
環境
- Ansible 2.8.5
- jinja2 2.10.1
例
単純な出力
vars.yml
---
vars:
include_backslash_text: '\n'
template.j2
{{ vars.include_backslash_text }}
出力結果
\n
to_jsonフィルタによる出力
vars.yml
---
vars:
include_backslash_text: '\n'
template.j2
{{ vars.include_backslash_text | to_json }}
出力結果
"\\n"
おそらく、to_json
フィルタによって値がダブルクォートで囲まれるため、フィルタが気を利かせてエスケープするものと思われます。
では、\n
のようなバックスラッシュを含む文字列をそのままJSON形式で出力するにはどうすればいいのでしょうか。
Solution
試行錯誤の結果、以下でうまくいきました。
vars.yml
---
vars:
include_backslash_text: "\n" # ダブルクォートにする
template.j2
{{ vars.include_backslash_text | to_json | regex_replace("\\\\", "\\\\") }}
出力結果
"\n"
なぜこれでうまくいくのかよく分かりませんが、もっといい書き方があれば教えてください。