Также вы можете использовать тройной фильтр:

единил два списка из инвентаря Ansible:

set_fact:
  fact1: "{{ groups['group1'] + groups[group2']|list }}

Выход:

fact1:
  - server01
  - server02
  - server03

С вышеупомянутыми результатами мне нужно добавитьhttps:// спереди и номер порта сзади каждого элемента. Затем мне нужно преобразовать его в список через запятую для конфигурации сервера.

В этом примере я хочу:https://server01:8000,https://server02:8000,https://server03:8000.

Я попытался использовать соединение:

set_fact:
  fact2: "{{ fact1|join(':8000,') }}"

который частично работал, но оставил последний сервер без порта.

Как я могу достичь своей цели?

Ответы на вопрос(2)

Также вы можете использовать тройной фильтр:

set_fact:
  fact2: "{% for it in fact1 %}https://{{ it }}:8000{{ loop.last | ternary('', ',') }}{% endfor %}"
Решение Вопроса

Решение

  fact2: "{{ fact1 | map('regex_replace', '(.*)', 'https://\\1:8000') | join(',') }}"

объяснение

map фильтр применяет фильтр (regex_replace) к отдельным элементам списка;

regex_replace фильтр (со следующим регулярным выражением) добавляетprefix а такжеsuffix в строку;

current_list | map('regex_replace', '(.*)', 'prefix\\1suffix')

join фильтр преобразует список в строку с разделителями-запятыми в выходных данных.

альтернатива

Другое возможное решение (основанное на том, что вы уже знаете) будет использовать Jinja2 непосредственно для целевой строки:


  fact2: "{{ 'https://' + fact1|join(':8000,https://') + ':8000' }}"

Ваш ответ на вопрос