Timur
щас будет 500раз по кругу
Давайте без этого нытья, пожалуйста.
Aleksey
Давайте без этого нытья, пожалуйста.
вы по кругу обсуждаете одно и тоже. как с лдапом
Aleksey
никто не виноват. все роли хоршие. все авторы тоже. жить мирно
George
а какие не простые? GUID генерить для префикса?
мне нравится. action: module '{{ v_2b5faf3a_3492_11eb_8f76-c3ea7e595ed2 }}' args: '{{ v_373b2866_3492_11eb_95de_d3c2cb1b42d3 }}' register: '{{ v_3d9171fc_3492_11eb_a6ce_33816f354bd6 }}' loop: ' {{ v_56691086_3492_11eb_8926_771b6adf7ba5 }}'
George
Который использует в роли переменную вида user
Т.е. у нас есть два варианта: 1) Потребовать ото всех использовать только сложные имена 2) Не создавать условия при которых такие проблемы возникают.
Aleksey
сделать на этом профайлере линтер и падать
George
Не нужно доводить до абсурда.
Это единственный метод избежать коллизий. Потому что если переменная называется clickhouse_listen, то его радостно юзает роль настраивающая кликхаус и роль, которая вычисляет адрес куда коннетиться в кликхаус. И не факт, что в одно и то же.
George
сделать на этом профайлере линтер и падать
Невозможно, include'ы и перменные с именами переменных всё сломают.
Aleksey
это конечно плохо, но у меня есть сервис у которого все методы api это какой то guid
надеюсь тебе платят на треть меньше рынка ижевска. что бы страдания длились вечно
Aleksey
Невозможно, include'ы и перменные с именами переменных всё сломают.
ты не сдавайся. нужно "просто" поработать ещё чуток
tutunak
надеюсь тебе платят на треть меньше рынка ижевска. что бы страдания длились вечно
да, страдаю потихоньку и пытаюсь выпилить это окончательно.
George
ты не сдавайся. нужно "просто" поработать ещё чуток
Эм, задача остановки полнорекурсивных функций не разрешима.
Aleksey
Эм, задача остановки полнорекурсивных функций не разрешима.
ты еще не пробовал, а уже говоришь. надо на стейдже прогонять и записывать все перекрытия. потом использовать собранное через бигдату и машинлернинг для построения блокчейна в датасаенсе и докладывать кому надо
Timur
Невозможно, include'ы и перменные с именами переменных всё сломают.
Динамические имена переменных - зло. Именно по такой причине.
George
ты еще не пробовал, а уже говоришь. надо на стейдже прогонять и записывать все перекрытия. потом использовать собранное через бигдату и машинлернинг для построения блокчейна в датасаенсе и докладывать кому надо
Хочешь смешную ансибл-байку? Роль clickhouse'а (которая AlexeySetevoi/ansible-clickhouse) одно время грузила переменные динамически по имени дистрибутива. И был файл Ubuntu.yaml, а в переменной было значение ubuntu. В зависимости от ОС контроллера оно либо работало, либо нет. Потому что у макоси регистронезависимая файловая система, а у линукса - зависимая.
Aleksey
кстати любители макоси должны страдать даже больше чем специалисты ниже рынка в ижевске.
George
Динамические имена переменных - зло. Именно по такой причине.
Это всего лишь частный случай от общей динамики (include'ов). В целом, как только мы получаем тьюринг-полный язык, анализировать его становится невозможно. Особенно, в контексте jinja.
George
И что эта байка должна нам сказать? Что автор роли плохо продумал работу с регистрами переменных?
Нет. Я хочу сказать, что после появления include_vars статический анализ можно закапывать. (И вообще, после любого include)
Aleksey
И что эта байка должна нам сказать? Что автор роли плохо продумал работу с регистрами переменных?
что есть еще один корнеркейс который надо предусмотреть в линтере же
Timur
Это всего лишь частный случай от общей динамики (include'ов). В целом, как только мы получаем тьюринг-полный язык, анализировать его становится невозможно. Особенно, в контексте jinja.
Еще раз. Твой исходный пойнт о том, что если у тебя попадутся одинаковые служебные переменные в разных ролях, то все сразу сломается - невалиден. Потому что роли не выполняются одновременно.
George
что есть еще один корнеркейс который надо предусмотреть в линтере же
Ты не можешь линтером заглядывать в переменные. Оно инклюдило как include_vars: {{ ansible_что-то_distro }}
Aleksey
Ты не можешь линтером заглядывать в переменные. Оно инклюдило как include_vars: {{ ansible_что-то_distro }}
смотря каким линтером. но поинт понятен да. опять же и снова профайлер на стейдже
Timur
Ты не можешь линтером заглядывать в переменные. Оно инклюдило как include_vars: {{ ansible_что-то_distro }}
Не надо никуда заглядывать. Нужно просто помнить про регистра при названии таких файлов с переменными. И проблем не будет на любом контроллере.
George
смотря каким линтером. но поинт понятен да. опять же и снова профайлер на стейдже
Профайлер на стейджинге просто не выполнит все case'ы. Статический анализ языка, в котором можно сделать template файла, а потом его же include, невозможен.
Aleksey
правда многие кейсы которые ты описываешь решаются линтерами. довольно примитивными
George
Еще раз. Твой исходный пойнт о том, что если у тебя попадутся одинаковые служебные переменные в разных ролях, то все сразу сломается - невалиден. Потому что роли не выполняются одновременно.
find . -type f|xargs --verbose cat cat ./play.yaml ./role2/tasks/main.yaml ./role1/vars/main.yaml ./role1/tasks/main.yaml --- - hosts: localhost gather_facts: false roles: - role1 - role2 --- - set_fact: foo: fact - debug: var=foo --- foo: 1 --- - debug: var=foo
George
В зависимости от порядка role1/role2 в play поведение role1 меняется.
Aleksey
единственное что в линтерах будет не тривиально это то что их будет много и запреты которые они будут делать часто будут выглядеть придирками
Aleksey
ну так все линтеры так себя ведут
George
проще просто перестать требовать reusable role, признать, что они имеют смысл только в рамках плейбуки и тестировать плейбуки. Линтеры это хорошо, но культ ролей при никудышном механизме interface enforcing - это просто трата времени и нервов.
Aleksey
это легко проверяется. это легко форсится. это понятно и это умеют подсказывать ide
Aleksey
да, это как обычно требует name convention. где его не требуют ?
George
не проще. проще придерживаться префиксов. это проще.
А потом у тебя есть роль clickhouse и роль clickhouse_user. В clickhouse есть перменная clickhouse_user_main, а в clickhouse_user есть переменная clickhouse_user_main, и значат они разное.
George
да, это как обычно требует name convention. где его не требуют ?
Последний раз, когда я юзал ansible-galaxy install, он этого не требовал.
George
Вместо того, чтобы реализовать приватные переменные внутри (как у всех языков программирования), сделали глобальный namespace образца zx-basic. Это последний язык программирования, в котором в go sub в подпрограмме нельзя было иметь приватных перменных.
Ivan
goto 10 ща было
George
Хороший тон и манера, это в роли название всех переменных делать с префиксом названия роли и тогда не будет таких проблем
А потом у тебя есть роль clickhouse и роль clickhouse_user. В clickhouse есть перменная clickhouse_user_main, а в clickhouse_user есть переменная clickhouse_user_main, и значат они разное. Простите за повтор.
George
Вы не поверите, у меня есть подобные роли и там нет таких проблем
У меня тоже. Но это не отменяет теоретической возможности получить это, если роли пишут разные люди/команды, а собирает в составе play третья
Vladislav 👻
У меня тоже. Но это не отменяет теоретической возможности получить это, если роли пишут разные люди/команды, а собирает в составе play третья
Если рассуждать о сферических вакуумах, то везде есть свои проблемы, грабли и прочее. Никакой ЯП вам не поможет это избежать, потому что сферически я смогу это уранить
Aleksey
Вы не поверите, у меня есть подобные роли и там нет таких проблем
фиг знает :) в ролях может и нет а в плейбуках есть
George
Если рассуждать о сферических вакуумах, то везде есть свои проблемы, грабли и прочее. Никакой ЯП вам не поможет это избежать, потому что сферически я смогу это уранить
Большинство языков программирования позволит вам использовать две функции от разных программистов так, чтобы у них не было пересечения по переменным, даже если переменные одинаково называются. Именно для решения сферического вакууума их и придумали.
Aleksey
как скомпоновать
George
А в благородных языках програмирования уровня Rust, так там такой enforce контрактов, что просто в буквальном смысле нельзя его не выполнить.
Vladislav 👻
фиг знает :) в ролях может и нет а в плейбуках есть
У меня плейбуки не перегружены хренью, там только запуск ролей и максимум, что я добавлял, это env и set_fact с when для сложной логике
Aleksey
George
Вот только Ansible - это не язык программирования
Поговорка, что Ансибл - это не язык программирования, это не его достоинство, а суммаризация его свойств. Он настолько плох в программировании, что "не надо программировать на Ансибле".
Aleksey
У меня плейбуки не перегружены хренью, там только запуск ролей и максимум, что я добавлял, это env и set_fact с when для сложной логике
это всё зависит от масштаба же. пока оно работает — оно работает. но когда нет оно печально.
Vladislav 👻
Aleksey
я наступал в нейминг. мне было больно но не горело так как у @amarao
Aleksey
200 машин и оно работает и работает как часы
это не тот масштаб. речь не про колво машина а про колво проектов в которых будет выйгрыш от переиспользования
Aleksey
пока у вас монорепа с плейбуком и ролями всё нипочём
Vladislav 👻
Aleksey
но как начинается распиливание на части и переиспользование между проектами будет неизбежно будет грабля.
Vladislav 👻
Пишу не один, есть репа для инфры, есть для деплоя, есть для проектов, все собрано там, где надо
George
я наступал в нейминг. мне было больно но не горело так как у @amarao
У меня подгорает потому, что инструмент плохой. Он хорош в одних вопросах (транспорт), но душераздирающе плох в других (программирование).
Vladislav 👻
Роли в целом не пересекаются
Nick
👍❤️❤️❤️❤️❤️❤️❤️❤️😍❤️😍🤝🤝🤝🤝🤝🤝🤝🙋‍♀🙋‍♀🙋‍♀🙋‍♀🙋✋🖐🖐🖐🤚🤚👋