Это ужасно. Дети, никогда не делайте этого!

У меня есть список (скажем, «данные»), в котором есть жалобы. Мне нужно добавить префикс и суффикс к каждой строке без использования циклов Ansible (например, потому что он уже находится в цикле или двух).

data:
  - string1
  - string2

Мы хотим преобразовать его в (с чистой мощью jinja2):

new_data:
  - prefix_string1_postfix
  - prefix_string2_postfix

Решение

new_data: '{{ (["prefix_"] * data|length)|zip(data)|map("join")|zip(["_suffix"] * data|length)|map("join")|list  }}'

Эм ... Xk’uzme?

Решение, объясненное

suffixes: '{{["_suffix"] * data|length }}'
prefixes: '{{["prefix_"] * data|length }}'
data_prefixes: '{{prefixes|zip(data)|map("join")|list}}'
new_data: '{{data_prefixes|zip(suffixes)|map("join")|list}}

Решение, объяснил, объяснил

suffixes: '{{["_suffix"] * data|length }}'
prefixes: '{{["prefix_"] * data|length }}'

suffixes: массив '_suffix' * N раз, где N == длина (данные).
prefixes: массив 'prefix_' * N раз, где N == длина (данные).
Оба используют Уловка Python, это [‘a’]*3 == [‘a’, ‘a’, ‘a’]. Нам нужно, чтобы эти массивы имели тот же размер, что и наш массив данных, чтобы использовать zip-фильтр.

data_prefixes: '{{prefixes|zip(data)|map("join")|list}}'

prefixes|zip(data) создает список списка: [[‘prefix_’, ‘string1’], [‘prefix_’, ‘string2']].

map («join») применяет «join» (без аргументов) к внутреннему списку. Получается: [‘prefix_string1’, ‘prefix_string2']. Последний «list» предназначен только для помощи debug с выводом (карта возвращает genexpr python вместо списка, поэтому мы преобразуем его обратно в список). Нам это не нужно в полноценной производственной среде.

new_data: '{{data_prefixes|zip(suffixes)|map("join")|list}}

Точно такой же трюк. map data_prefixes с суффиксами для создания вложенного списка:

[['prefix_string1', '_suffix'], ['prefix_string2', '_suffix']]

Затем мы присоединяемся и снова конвертируем в список:

['prefix_string1_suffix', 'prefix_string2_suffix'].

Пост скриптум

Я хотел бы сказать: «Никогда не используйте это в производстве», за исключением того, что я разрабатываю эту ужасную технику, чтобы избежать более распространенных ужасов в моем производстве. Грустно, грустно, jinja2.

Регулярные выражения?

На следующий день после того, как я написал эту статью, akint показал мне более простое решение. Мне стыдно, потому что на этот раз регулярные выражения упрощают задачу:

new_data: '{{ data | map("regex_replace", "^(.*)$", "prefix_\1_suffix") | list }}'