it-swarm.com.ru

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

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

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

Проблема в:

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

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

33
Timofey Stolbov

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

Задача как это:

- include_vars: concat.yml

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

newvar: "{{ var1 }}-{{ var2 }}-{{ var3 }}"
27
udondan

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

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

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

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

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

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

20
user187557

Это так же просто, как объединение списков в 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
10
user9996458