zaki work log

作業ログやら生活ログやらなんやら

[Ansible / Jinja2] 「{{ sample }}」 という文字列を出力するためのエスケープ記述

お題:以下の内容のテキストを出力したい。

{{ username }}
{{ password }}

Jinja2で変数参照する際は、{{ 変数名 }} と記述するため、{はそのままでは出力することはできません。 2通りの方法があるのでそのやり方についてメモ。

詳細はJinja2のEscapingの項を参照。

jinja.palletsprojects.com

(1) 変数式({{ ... }})の中で直接記述する

{{ '{{' }}と記述することで、{{を出力できます。
1行で済む場合や出力量が少ない場合はこちらが簡潔に書けると思います。

  - copy:
      content: |
        {{ '{{' }} username {{ '}}' }}
        {{ '{{' }} password {{ '}}' }}
      dest: template.txt

(2) rawブロックを使う

{% raw %}~{% endraw %}を使うと、対象のブロックは変数展開や制御は行われずそのままの出力になります。 機能的にはhtmlの<pre>や、Markdownのコードブロックと同様です。

  - copy:
      content: |
        {% raw %}{{ username }}{% endraw +%}
        {% raw %}{{ password }}{% endraw %}
      dest: template.txt

上記のように行ごとに記述する場合、{% endraw %}・改行・{% raw %}と書くと出力からは改行が削除されるため、endrawの後に+を置くと削除されません。
下記のようにまとめて書けば、Jinja2の改行処理は気にせずに書いたとおりに出力されます。

  - copy:
      content: |
        {% raw %}{{ username }}
        {{ password }}{% endraw %}
      dest: template.txt

詳しくはJinja2のWhitespace Controlの項を参照。

jinja.palletsprojects.com


だいたいAWX/AAPの認証情報タイプを定義するplaybookでinjectorsを書くときに必須になるはず…