Проблема с синтаксическим анализом вывода шаблона Jinja2 на запятую

Я написал шаблон jinja2 для ansible playbook. Однако мне не нужна запятая в конце последней строки по этой причине, я использовал условие "if" с "loop.last". Поскольку есть цикл "for" и цикл "if", последняя строка выполняется два раза - один с запятой, а другой без запятой. любая помощь будет оценена, если последняя строка будет выполнена один раз без запятой.

  [{% for ip inrange  %}
  "127.0.0.1:{{ ip }}",
     {% ifloop.last %}
       "127.0.0.1:{{ ip }}"
     {% endif %}
  {% endfor %}]

Ниже приведен результат, который я получаю.

[  "127.0.0.1:6000",
         "127.0.0.1:6001",
         "127.0.0.1:6002",
         "127.0.0.1:6003",
         "127.0.0.1:6004",
         "127.0.0.1:6005",
         "127.0.0.1:6006",
            "127.0.0.1:6006"
       ]

Ожидаемый результат:

  ["127.0.0.1:6000", "127.0.0.1:6001", "127.0.0.1:6002", "127.0.0.1:6003", "127.0.0.1:6004", "127.0.0.1:6005", "127.0.0.1:6006" ]

Благодарность

2 ответа

Решение

Вы могли бы добавить elseпункт для непоследних итераций. попробуйте этот файл шаблона:

[{% for ip in range  %}
{% if loop.last %}
"127.0.0.1:{{ ip }}"{% else %}
"127.0.0.1:{{ ip }}", {% endif %}
{% endfor %}]

созданный файл:

[root@greenhat-30 tests]$ cat /tmp/test.out         
["127.0.0.1:6001", "127.0.0.1:6002", "127.0.0.1:6003", "127.0.0.1:6004", "127.0.0.1:6005", "127.0.0.1:6006"]
[root@greenhat-30 tests]$ 

Надеюсь, это поможет

  1. Вы должны быть особенно осторожны с вашим именем var. rangeна самом деле является функцией jinja2 и иногда может вызывать ошибки.
  2. Ваша текущая проблема в основном сводится к преобразованию списка ввода путем добавления префикса и вывода результата в виде строки json.

В приведенном ниже примере:

  • Начальный range(6001,6007)динамически заменяет текущую переменную на то же количество значений (например). Вы можете просто заменить эту функцию своей переименованной переменной, содержащей ваш фактический список значений (см. Пункт 1 выше).
  • Я использую regex_replaceфильтр с map добавить 127.0.0.1: к каждому значению в списке.
  • Наконец, я использую to_jsonфильтр для вывода списка в желаемый формат.

Окончательный шаблон:

{{ range(6001,6007) | map('regex_replace','^', '127.0.0.1:') | list | to_json }}

Мы можем легко проверить это с помощью доступной задачи отладки:

---
- name: Demo template
  hosts : localhost
  gather_facts: false

  tasks:

    - name: Add prefix to range list and output json
      debug:
        msg: "{{ range(6001,6007) | map('regex_replace','^', '127.0.0.1:') | list | to_json }}"

Что дает (Примечание: обратная косая черта добавляется отладкой, чтобы избежать двойных кавычек в строке результата. Фактический вывод в шаблоне результата не будет содержать их.)

PLAY [Demo template] ****************************************************************************************************************************************************************************************************************************************************

TASK [Add prefix to range list and output json] *************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "[\"127.0.0.1:6001\", \"127.0.0.1:6002\", \"127.0.0.1:6003\", \"127.0.0.1:6004\", \"127.0.0.1:6005\", \"127.0.0.1:6006\"]"
}

PLAY RECAP **************************************************************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
Другие вопросы по тегам