web-dev-qa-db-ja.com

Ansibleテンプレートに表示される余分なスペース

私は設定ファイルを生成していて、それをインデントしたいのです。単純なpythonプログラムから呼び出されたときに正しくレンダリングされるJinja2テンプレートを使用して開始しました。これをansibleから呼び出すと、ループの最初の行を除くすべてに2つの余分なスペースが生じます。生成YAMLとpython=のようなものは本当に苦痛でした。これを修正するためにforブロックの最初の行としてコメント行を置くことにしました...

以下は、YAMLジェネレーターの非常に単純な例です。

プレイブックコール:

  - name: generate bgp vars file, put in includes directory
    local_action: template src={{ role_dir }}/templates/bgp_vars.j2 dest={{ incvar_dir }}/bgp_vars.yaml
    run_once: true

テンプレートのセクション:

dc_route_reflectors:
{% for dc in SH_dcs %}
# dc is "{{ dc }}"
  {{ dc }}:
  {% for Host in groups[bgpgroupname] if dc == hostvars[Host].MYDC %}
    - "{{ hostvars[Host].MAIN_MYADDR }}"
  {% endfor %}
{% endfor %}

レンダリングされた出力:

dc_route_reflectors:

# dc is "pnp"
  pnp:
      - "10.100.16.3"
      - "10.100.32.3"
  # dc is "sgs"
  sgs:
      - "10.8.0.3"
      - "10.8.16.3"
  # dc is "cst"
  cst:
      - "10.4.0.3"
      - "10.4.16.3"
  # dc is "dse"
  dse:
      - "10.200.0.3"
      - "10.200.16.3"

Dc is "pnp"コメントはテンプレートに示されているようにインデントされていないことに注意してください。ただし、sgs、cst、およびdseコメントは2つのスペースでインデントされています。 IPアドレスの配列行もすべてインデントされています。 Jinja2で説明されているように、「%」に「-」を追加するさまざまなバージョンを試してみましたが、一貫した正しい結果は得られませんでした。

他の人はこれを以前に見たことがあるに違いありません。 CentOS7で2.2.1.0を実行しています。

17
JerryS

まず、ステートメントの前に明示的に追加したスペースを削除し、データのみのインデントを維持することができます。

dc_route_reflectors:
{% for dc in SH_dcs %}
# dc is "{{ dc }}"
  {{ dc }}:
{% for Host in groups[bgpgroupname] if dc == hostvars[Host].MYDC %}
    - "{{ hostvars[Host].MAIN_MYADDR }}"
{% endfor %}
{% endfor %}

ステートメントのインデントを維持したい場合は、lstrip_blocksオプションをTrueに設定できます(注意:宣言はテンプレートの最初の行にある必要があります):

#jinja2:lstrip_blocks: True
dc_route_reflectors:
{% for dc in SH_dcs %}
# dc is "{{ dc }}"
  {{ dc }}:
  {% for Host in groups[bgpgroupname] if dc == hostvars[Host].MYDC %}
    - "{{ hostvars[Host].MAIN_MYADDR }}"
  {% endfor %}
{% endfor %}

Jinja2の whitespace control の詳細をご覧ください。


Ansibleは、trim_blocksを有効にしてlstrip_blocksを無効にしてJinja2を実行します。

したがって、テンプレートに入力したすべてのスペース(ステートメントと式の外)は、出力の一部と見なされます。 「余分なスペース」は追加されません。

Dc is "pnp"コメントがテンプレートに表示されているようにインデントされていないことに注意してください。ただし、sgs、cst、およびdseコメントは2つのスペースでインデントされています。

これらの2つのスペースは、テンプレートの7行目({% endfor %}の前)に含まれています。

IPアドレスの配列行もすべてインデントされています。

これらのスペースは、テンプレートの5行目({% for Hostの前)に定義されています。

26
techraf