padding/ljust 使用 ansible 模板和 jinja

padding/ljust with ansible template and jinja

我正在寻找一种方法来使用这本字典在 ansible 中创建模板。

data= {
  "_dictionary": {
    "keyone": "abc",
    "rtv 4": "data2",
    "longtexthere": "1",
    "keythree": "data3",
    "keyfour": "data1234",
  }
}

模板输出应具有以下格式:

 keyone          abc
 keytwo          data2
 longtexthere    1
 keythree        data3
 keyfour         data1234

使用 python 我可以创建它:

w = max([len(x) for x in data['_dictionary'].keys()])
for k,v in data['_dictionary'].items():
    print('    ', k.ljust(w), '  ', v)

但我无法在 ansible 的 jinja2 模板中创建它。我还没有找到 ljust 的替代品。

目前我的模板是这样的,但是我得到了一个没有格式的输出。

{% for key, value in data['_dictionary'].items() %}
    {{ "%s\t%s" | format( key, value ) }}
{% endfor %}

有什么想法、建议吗?

例如

    - debug:
        msg: |
          {% for k,v in data['_dictionary'].items() %}
          {{ "{:<15} {}".format(k, v) }}
          {% endfor %}

给予

  msg: |-
    keyone          abc
    rtv 4           data2
    longtexthere    1
    keythree        data3
    keyfour         data1234

参见 format and Format String Syntax


问:"动态创建格式。"

A:比如找字典中最长的key。在第一列的长度上再增加 1 space。同理,计算第二列的长度,在单独的变量中创建格式字符串

    - debug:
        msg: |
          {% for k,v in data['_dictionary'].items() %}
          {{ fmt.format(k, v) }} # comment
          {% endfor %}
      vars:
        col1: "{{ data._dictionary.keys()|map('length')|max + 1 }}"
        col2: "{{ data._dictionary.values()|map('length')|max + 1 }}"
        fmt: "{:<{{ col1 }}} {:<{{ col2 }}}"

给予

  msg: |-
    keyone        abc       # comment
    rtv 4         data2     # comment
    longtexthere  1         # comment
    keythree      data3     # comment
    keyfour       data1234  # comment

正在运行,最后我的 j2 文件是:

{% set col1 = data._dictionary.keys()|map('length')|max %}
{% set fmt = "{:<" + col1|string + "}    {}" %}
{% for key, value in data._dictionary.items() %}
    {{ fmt.format(key, value) }}
{% endfor %}

谢谢。