Sergey
😉
George
... И они перезатрут переменные из инвентори.
Sergey
Если одноимённые - то да.
Alex
> Глупый вопрос: а переменные, определённые в roles/role1/vars/main.yaml видны в role2? (role1 и role2 назначены на один хост)
не видны, собственно этого и хочется добиться, чтобы были видны
George
... Это не путь на тёмную сторону, это гигантская грабля, которую я час отлавливал, причём в режиме "variable is undefined", потому что соседняя роль в эту переменную писала имя несуществующей переменной.
checkdiff
касательно перезатирания, если вызывать роль внутри роли и передавать переменные непосредственно через vars, то все будет ок, перезатирания не будет.
George
Не, я про простой roles: [role1, role2].
George
Мой эксперимент показывает, что перезатирает. Дикий wtf.
Sergey
checkdiff
поэтому ввели конвенцию что роли имеют независимые переменные изначально)
George
Обожаю глобальные переменные и goto. Мне кажется, в ansible надо добавить поддержку goto на произвольную таску. /сарказм.
Alex
не хотелось бы плодить сущностей. Например две роли используют одни и теже пути
checkdiff
Alex
которые объявлены в переменной
Sergey
Alex
пихать в all не хотелось бы
Sergey
Всё уже выдумано.
George
George
Если бы у нас был "просто словарь", то я мог бы сделать a: '{{ a + 1}}'. А я не могу, ибо бесконечная рекурсия. А ещё сверху накручиваются приоритеты разных источников перменных, которые доставляют особое развлечение при include'ах.
George
... А потом роль с galaxy случайно объявляет твою переменную у себя в vars и....
Sergey
George
Нет, я скачиваю роль с galaxy и заучиваю все её перменные наизусть. не дай бог что-то забыть.
Sergey
George
@Sergey Pechenko, а ты как решаешь эту проблему?
Sergey
Sergey
А по делу - знаю свой софт, переиспользую роли, роли с Galaxy использую как справочник, 5D игнорю.
Sergey
Не пишу универсальные комбайны, которые на 17 ОС и 5 версий софта.
Alex
везет
Alex
а иногда приходится
George
... Уточни, пожалуйста, насчёт "знаю свой софт". У меня без "комбайна" в проекте примерно 100 разных приложений, 150 ролей. Мне аж интересно стало как это всё можно наизусть помнить.
George
А на счёт "не используй 100 приложений в одной плейбуке" - получается, что чем дальше в крупный софт, тем тяжелее проекты на ansible сопровождать. Особенно, когда над проектом работает несколько человек.
Alex
вот мы сейчас пишем проверку инсталяторов для Artifactory и там как минимум надо поддерживать Debian 8/9, Centos 6/7, RHEL 6/7/8, Ubuntu 14/16/18, а еще windows :)
George
... А как вы достигаете отсутствия коллизий по именам переменных? role_name_{{uuid}}_{{var_name}} в имени каждой переменной? Никаких там 'local_address' или 'query_result'?
Sergey
Что такое query_result? Это CURLом схожено куда-то в башсибле? 😉
Sergey
Избегаю башсибла, опять же.
George
George
это гениально
George
ибо действительно сложность системы растет нелинейно
George
Во. Вот программисты придумали, что когда сложность растёт нелинейно, надо использовать модульность. А ансибл активно сопростивляется любой попытке добавить модульность.
Sergey
George
George
Я весь внимание о том, как сделать два куска ансибла так, чтобы они могли работать вместе и не ломать друг другу ничего.
George
не использовать куски ансибла, а писать их все самому
George
но это сразу ад для мейтейнера
George
((((
Sergey
Sergey
Не тянуть разное с Galaxy.
George
George
ну, да, проблемы глобального состояния. Но ансибл - это не язык программирования (С)
George
Sergey
😉
kevit
kevit
вырезка из ansigenome
kevit
очень, очень сложно сделать чтобы ничего не ломалось
George
Тьюринг-полный не-язык программирования с тьюринг-полным шаблонизатором, поддерживающий циклы, ветвления, обработку исключений, динамическую подгрузку кода - и всё только с глобальными перменными.
kevit
assert + врапперы
kevit
немного помогает
kevit
но хотелось бы конечно больше
kevit
помогает еще бить по рукам за set_fact, прекоммиты, кодревью, именование переменных с префиксом по имени роли
kevit
your mileage may vary
Отделение Bereke Bank
kevit
наоборот хорошо
Sergey
Тьюринг-полный не-язык программирования с тьюринг-полным шаблонизатором, поддерживающий циклы, ветвления, обработку исключений, динамическую подгрузку кода - и всё только с глобальными перменными.
Ну если использовать как язык программирования - да, всё плохо. Но если не пытаться - то всё ок.
Язык - Python, именно на нём надо писать плагины и модули, а не пытаться обойти ограничения существующих конструкций.
Тут периодически LDAP делают на Ansible, было дело - и Git пытались. Но это же не повод всем так делать, и не значит, что это правильно.
George
Всё это описывается двумя словами: defensive programming.
George
А мантра "не язык программирования" странно контрастирует с всё новыми и новыми фичами языка программирования, которые появляются в ansible. block с секцией always, include_role, include_vars...
kevit
вот блок это для врапперов
Михаил Telsir
George
George
Там, небось, большая часть - комменты в шаблонах.