в двух группах для каждой группы используется переменная foo, хранящая список. по умолчанию, будет использована одна какое-то одно значение из них при запуске плейбука. сделать в объявлении переменных foo: "{{ foo | union(['new-value']) }}" тоже нельзя из-за циклической ссылки. напрямую эта переменная в роль не передается и сейчас единственно решение, которое я вижу это передавать эту переменную в роль через параметры, что-то типа "foo: {{ foo1 | union(foo2) }}, но тогда в group_vars их придется также переименовать и придется каждый раз менять еще и плейбук, когда появится третья группа в которой хост будет учавстввать. есть ли какое-то более простое решение, чтобы "смержить" два значения в одной переменной? спасибо
Сделать в каждой группе свою переменную и в плее их мержить как угодно.
спасибо. как я написал выше это решение мне кажется костылем, который придется каждый раз допиливать, добавляя хост в новую группу. есть более простое решение, не требующее менять роль/плейбук, или это стандартный метод решения данной проблемы на текущий момент?
Это не совсем проблема. Так работает ансибл с инвентарём. Все переменные хоста со всех групп, куда он входит, схлопываются в его hostvars https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#how-variables-are-merged
Попробуйте для начала понять, как работают переменные разных уровней в ансибле, и что из разных групп значения одной и той же переменной не мержатся. В идеале они вообще не должны пересекаться таким образом.
А можно узнать исходную задачу вместо подбора странного решения, которое вы придумали с группами?
Вот такое решение есть https://github.com/leapfrogonline/ansible-merge-vars но это на любителя
есть роль nfs. в зависимости от группы, которой принадлежит хост нужно маунтить что-то. разные группы требуют разных маунтов и оказалось пост-фактум, что хост может оказаться в двух группах.
спасибо. я видел это решение, но по мне это уже совсем перебор. проще переменную в роль передать параметром
Возьмите за правило, что в разных группах одного хоста не должно быть пересекающихся переменных. Если они есть, то они не объединяются, а перезаписывают друг друга в соответствие с приоритетом.
Я в итоге тоже не стал использовать, а пишу каскад переменных + flatten
я знаю об этом и это никак не отвечает на мой вопрос: что делать в этим пост-фактум.
Пересматривать структуру данных и исправлять последствия неправильного подхода. Что тут еще можно посоветовать?
не могли бы вы уточнить, что имеете в виду под "каскадом переменных"?
этот таск уже в беклоге. у меня есть и dirty hack, а всего лишь искал подтверждения или опровержения, что найденный мной вариант самый простой.
Ничего не понял, если честно
спасибо за ваше время
В группварз_алл пишу some_var: [ some_var_group_A, some_var_group_B ] . В каждой группе, соответственно, Саша переменная. А в роли {{ some_var | flatten }}. (Сорян, с телефона не очень удобно)
Зачем вам хост , который в трех группах и использует одни и те же переменные ?
Обсуждают сегодня