带有循环的ansible jinja模板,丢失换行符

时间:2018-10-02 18:39:31

标签: ansible jinja2 ansible-template

尝试从模板构建JSON文件。这样就可以正常工作,但是由于某些原因,循环结构中的换行符丢失了,我觉得这很烦人。该文件“有效”(机器可读就可以了),但是对于人类来说,它是不合适的。

这是我的模板:

{
        "Users": 
        [
{% for username,user in _vpn_user_accounts.items() %}
              {
              "Name" : "{{ user.name }}",
              "Hash" : "{{ user.hash }}",
              "Cns" : [
{% for cn in user.cns.get(server_name, []) %}
                      "{{ cn }}"{% if not loop.last -%},{% endif %}
{% endfor %}
              ],
              "key_ids" : [
{% for key in user.get( 'keys' , []) %}
{% if key.public is defined %}
                      "{{ key.public }}"{% if not loop.last %},{% endif %}
{% endif %}
{% endfor %}
              ],
              "comment" : "{{ user.get( 'comment', '' ) }}"
              } {% if not loop.last %},{% endif %}
{% endfor %}
        ]
}

以下是一些示例数据:

  - andrej:
      name: "andrej"
      hash: "$2b$10$8EF3H.../Wj0RchEqU6"
      cns:
        h:
          - "andrej_linux_h_201808171440"
          - "andrej_linuxvm_h_201809131031"
          - "andrej_mac_h_201808171441"
          - "andrej_phone_h_201808171441"
        w:
          - "andrej_linux_w_201808171439"
          - "andrej_linuxvm_w_201809131031"
          - "andrej_mac_w_201808171441"
          - "andrej_phone_w_201808171441"
      keys:
        - name: "andrej"
          public: "kbjrvtni"
        - name: "andrej2"
          public: "ijrltifu"
        - name: "andrej3"
          public: "rbcvncbt"
      comment: "systems"

这是我想要的结果(针对服务器“ w”运行):

{
    "Users": 
    [
            {
                    "Name" : "andrej",
                    "Hash" : "$2b$10$8EF3H.../Wj0RchEqU6",
                    "Cns"  : [ 
                            "andrej_linux_w_201808171439",
                            "andrej_linuxvm_w_201809131031",
                            "andrej_mac_w_201808171441",
                            "andrej_phone_w_201808171441"
                    ],
                    "key_ids" : [ 
                            "kbjrvtni",
                            "ijrltifu",
                            "rbcvncbt" 
                    ],
                    "comment" : "systems guy"
            }
     ]
}

这就是我得到的:

{
    "Users": 
    [
            {
                    "Name" : "andrej",
                    "Hash" : "$2b$10$8EF3H.../Wj0RchEqU6",
                    "Cns"  : [ 
                            "andrej_linux_w_201808171439",                                "andrej_linuxvm_w_201809131031",                                "andrej_mac_w_201808171441",                                "andrej_phone_w_201808171441"                        ],
                    "key_ids" : [ 
                            "kbjrvtni",                                "ijrltifu",                                "rbcvncbt"                         ],
                    "comment" : "systems guy"
            }
     ]
}

我已经尝试过#Jinja2: trim_blocks#Jinja2: keep_newline,但都没有显示出想要的结果。嗯,trim_blocks kind 确实做到了,但是它也给了我一堆空行,其中Jinja条件...不令人满意。

关于如何解决此问题的任何提示?就像我说的那样,它可以工作,但是让我很生气,因为我无法获得人类可读的漂亮输出。

1 个答案:

答案 0 :(得分:1)

这个小小的改变实际上使问题最终消失了。

#jinja2: trim_blocks:False
{
        "Users": 
        [
{% for username,user in _vpn_user_accounts.items() %}
              {
              "Name" : "{{ user.name }}",
              "Hash" : "{{ user.hash }}",
              "Cns" : [
{%- for cn in user.cns.get(server_name, []) %}
                      "{{ cn }}"{% if not loop.last -%},{% endif %}
{%- endfor %}
              ],
              "key_ids" : [
{%- for key in user.get( 'keys' , []) %}
{% if key.public is defined %}
                      "{{ key.public }}"{% if not loop.last %},{% endif %}
{% endif %}
{%- endfor %}
              ],
              "comment" : "{{ user.get( 'comment', '' ) }}"
              } {% if not loop.last %},{% endif %}
{% endfor %}
        ]
}