Рассчитать необходимые места в Jinja2 / Ansible

Я пытаюсь вычислить необходимое пространство на основе самого длинного слова в словаре.

Кажется, что переменная 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 ответ

Решение

Вы правы, вы не можете получить переменные из циклов таким образом. См. "Обзорное поведение" в документах.

Одним из вариантов является использование того, что они предлагают, и создание пространства имен:

{% 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 %}
Другие вопросы по тегам