Проблема с синтаксическим анализом вывода шаблона 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]$
Надеюсь, это поможет
- Вы должны быть особенно осторожны с вашим именем var.
range
на самом деле является функцией jinja2 и иногда может вызывать ошибки. - Ваша текущая проблема в основном сводится к преобразованию списка ввода путем добавления префикса и вывода результата в виде строки 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