Ansibleでバックスラッシュをto_jsonフィルタで出力したい


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"

なぜこれでうまくいくのかよく分かりませんが、もっといい書き方があれば教えてください。