2017-03-20 26 views
3

私は設定ファイルを生成しています。私は、単純なPythonプログラムから呼び出されたときに正しくレンダリングされるJinja2テンプレートを使い始めました。私がそれを不可能な人から呼び出すと、ループの最初の行以外の2つの余分なスペースが得られます。 YAMLやPythonのようなものを生成することは本当の苦痛でした。余分なスペースが可能なテンプレートに表示されます

脚本コール:

- 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 
私はここで

はYAMLジェネレータの本当に簡単な例です...この問題を解決するためのブロックのための最初の行としてコメント行を置くために行きましたテンプレートの

セクション:

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が "pnp"であることに注目してください。コメントはテンプレートに表示されるのでインデントされませんが、sgs、cst、およびdseコメントは2つのスペースで字下げされます。 ipアドレスの配列行もすべてインデントされます。私はJinja2が記述しているように、 "%"のものに " - "を追加するさまざまなバージョンを試しましたが、一貫した正しい結果は得られませんでした。

他にもこれを見たことがあるはずです。私はCentOS7で2.2.1.0を走っています。

答えて

6

開始のために、あなたはちょうどあなたが明示的にあなたの文の前に追加のスペースを削除することができますし、データのみのためにインデントを保つ:

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 %} 

あなたは文のインデントを維持したい場合は、あなたが設定することができますがTrueからlstrip_blocksオプション(注意:宣言は、テンプレートの最初の行でなければなりません):

#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_blockslstrip_blocks無効とJinja2のを実行します。

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

dcが "pnp"であることに注目してください。コメントはテンプレートに表示されているようにインデントされていませんが、sgs、cst、およびdseコメントは2つのスペースで字下げされます。

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

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

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

+0

それでした。私がPython内でそれを実行していたとき、それは反対のデフォルトになっているはずです。 – JerryS

+0

@ JerrySヘルプセンターをご覧ください:[あなたの質問や「ありがとう」と言う回答にコメントを付けないでください。](http://stackoverflow.com/help/someone-answers)。 – techraf

+0

ありがとう@techrafの #jinja2:lstrip_blocks:True私が理解していないのは、テンプレートとしてのジンジャーが最初の場所でスペースを混乱させる理由は、テンプレートの目的を破るようです – user2056182

関連する問題