Правильный способ объединения строк переменных

Мне нужно создать новую переменную из содержимого других переменных. В настоящее время я использую что-то вроде этого:

- command: echo "{{ var1 }}-{{ var2 }}-{{ var3 }}"
  register: newvar

Проблема в:

  • Использование {{ var1 }}...{{ varN }} приводит к слишком длинным строкам и очень уродливому коду.
  • Использование {{ newvar.stdout }} немного лучше, но сбивает с толку.
  • Использование set_fact модульных кэшей факт между запусками. Это не подходит для меня.

Есть ли другое решение?


person Timofey Stolbov    schedule 02.07.2015    source источник


Ответы (3)


Хороший вопрос. Но я думаю, что нет хорошего ответа, который соответствует вашим критериям. Лучшее, что я могу придумать, это использовать дополнительный файл vars.

Такая задача:

- include_vars: concat.yml

И в concat.yml у вас есть свое определение:

newvar: "{{ var1 }}-{{ var2 }}-{{ var3 }}"
person udondan    schedule 02.07.2015

Поскольку строки в Python представляют собой списки символов, мы можем объединять строки так же, как мы объединяем списки (со знаком +):

{{ var1 + '-' + var2 + '-' + var3 }}

Если вы хотите направить полученную строку в какой-либо фильтр, убедитесь, что вы заключаете биты в круглые скобки:

например Чтобы объединить наши 3 vars и получить хэш sha512:

{{ (var1 + var2 + var3) | hash('sha512') }}

Примечание: это работает на Ansible 2.3. Я не тестировал его на более ранних версиях.

person user187557    schedule 03.10.2017

Так же просто, как объединение списков в самом Python.

ansible -m debug -a msg="{{ '-'.join(('list', 'joined', 'together')) }}" localhost

localhost | SUCCESS => {
  "msg": "list-joined-together" }

Работает так же, используя переменные:

ansible -m debug -a msg="{{ '-'.join((var1, var2, var3)) }}" localhost
person user9996458    schedule 26.06.2018
comment
Только в сторону. Почему ansible -m debug -a msg="title {{ '-'.join((var1, var2, var3)) }}" localhost не работает? - person orodbhen; 10.04.2019
comment
@orodbhen не уверен на 100%, но похоже на какую-то странную проблему с разбором аргументов - попробуйте: ansible -m debug -a "msg='{{ var1 }} title {{ var1 }} {{ \"-\".join((var1, var2, var3)) }}'" localhost -e var1=test -e var2=foo -e var3=bar - person dossy; 30.06.2019
comment
Интересно, что это тоже работает: ansible -m debug -a "msg='{{ var1 }} title {{ var1 }} {{ '-'.join((var1, var2, var3)) }}'" localhost -e var1=test -e var2=foo -e var3=bar - person dossy; 30.06.2019