かまたま日記3

プログラミングメイン、たまに日常

Jinja2テンプレートでincludeしたファイルにインデントをつける

環境

  • Jinja2 2.2.8 *1

何に困っていたか

AnsibleでNginxの設定ファイルを作ってた時に、共通設定ファイルを作って必要な箇所でincludeしていたが、共通ファイルの方がインデント付いてなくて出来たファイルのインデントが崩れてしまう。

このファイルを(common.j2とする)

location /common {
    proxy_pass https://common.example.com;
}

このファイルに普通にincludeすると

server {
    listen 443 ssl http2;
    server_name example.com;

    {% include "common.j2" %}
}

こうなる

server {
    listen 443 ssl http2;
    server_name example.com;

    location /common {
    proxy_pass https://common.example.com;
}
}

解決策

FilterブロックとIndentフィルター(この辺)を使います。

FilterとIndentを使ってこう書くと

server {
    listen 443 ssl http2;
    server_name example.com;
{% filter indent %}
    {% include "common.j2" %}
{% endfilter %}
}

こうなります

server {
    listen 443 ssl http2;
    server_name example.com;
    location /common {
        proxy_pass https://common.example.com;
    }
}

調整する

インデントを付ける幅を変えたい場合は第一引数にスペース幅を(デフォルトは4)、最初の行をインデント付けたい場合は第二引数にTrueを入れます。
こんな感じ(common.j2もインデント幅が2になってるの前提)

server {
  listen 443 ssl http2;
  server_name example.com;
{% filter indent(2,True) %}
{% include "common.j2" %}
{% endfilter %}
}

*1:Ansible1.9.4に同梱のバージョン