Проблема разбора вывода шаблона Jinja2 для запятой - PullRequest
0 голосов
/ 09 ноября 2019

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

  [{% for ip in range  %}
  "127.0.0.1:{{ ip }}",
     {% if loop.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 ]

1 голос
/ 09 ноября 2019

Вы можете добавить предложение 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]$ 

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

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

В следующем примере:

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