计算Jinja2中的所需空间/ Ansible

时间:2018-08-25 22:21:32

标签: ansible jinja2 ansible-2.x

我正在尝试根据字典中最长的单词来计算所需的空间。

尽管变量num似乎没有将其值传输到第二个内部循环。

我基本上是在尝试计算空格数量以正确对齐列。

{% for module in modules %}
module "{{ module.name }}" {
  source = "{{ module.source }}"
  {% set num = 1 %}
{% for n in module.vars.keys() %}
  {% if  num < n|length %}
    {% set num = n|length %}
  {% endif %}
    {{ num }}: {{ n }} 
{% endfor %}
{% for m in module.vars %}
    {{ num }}
  {{ m }} {{ '= "' + module.vars[m]|indent(width=num) }}"
{% endfor %}
}

1 个答案:

答案 0 :(得分:1)

是的,您不能以这种方式使变量脱离循环。请参阅docs中的“作用域界定”。

一种选择是使用他们的建议并创建一个命名空间:

{% set ns = namespace(num=0) %}
{% for n in module.vars.keys() %}
  {% if ns.num < n|length %}
    {% set ns.num = n|length %}
  {% endif %}
    {{ ns.num }}: {{ n }} 
{% endfor %}

在您的情况下,有一个更简单,更干净的解决方案:您可以计算表达式中的最大宽度。使用map()获取长度列表,并使用max过滤器获取最大长度:

{% set indent_width = module.vars.keys() | map("length") | max %}
{% for m in module.vars %}
   {{ m }} {{ '= "' + module.vars[m]|indent(width=indent_width) }}"
{% endfor %}